Как предложил Йохахим Исакссон в комментариях, теперь у меня есть метод SetData(Data data)
и используйте его следующим образом:
MyPage1?.SetData(this.data);
MyPage2?.SetData(this.data);
MyPage3?.SetData(this.data);
Не обязательно лучший способ, но если вам просто нужно что-то сделать, вы можете немного изменить свой код круга. Добавьте параметр функции float arc_length
в подпись функции. Замените 2.0f * 3.1415926f
на arc_length
. Если вам нужно запустить дугу при заданном смещении, вы можете добавить еще один параметр с именем float arc_start
. Затем добавьте arc_start
в theta
на каждой итерации вашего цикла for
.
Редактирование на основе комментариев Saman:
То, что вы на самом деле хотите, это не дуга, а более общее представление кривой. Дуга представляет собой вид кривой, но это особый вид - т. Е. один с постоянным радиусом. Похоже, вы хотите нарисовать произвольные кривые, потенциально с разными радиусами. Если это так, то моя рекомендация - кривые Безье. Вот довольно солидное введение:
http://devmag.org.za/2011/04/05/bzier-curves-a-tutorial/
Обратите внимание на часть позже в руководстве по их рисованию, где автор говорит: «Самый простой способ - использовать небольшие приращения t для вычисления последовательных точек». Это в значительной степени то, что вам нужно сделать, чтобы нарисовать кривую Безье в OpenGL. Выберите значение t
и увеличьте его в цикле for, как и с theta
в исходном коде круга. Для каждой итерации нарисуйте точку.
У вас разные решения, основанные на том, как вы рисуете свой круг. В настоящее время то, что вы делаете, состоит в том, чтобы разделить 2*pi
на сегменты n
и соединить их вместе. Ну, первое решение, которое приходит на ум, - изменить диапазон дуги.
Например, чтобы сделать только дугу 3*PI/4
, вы можете просто изменить свой
float theta = 2.0f * PI * float(ii) / float(num_segments);
-
float theta = 3.0f * PI / 4.0f * float(ii) / float(num_segments);
Или, если вы считаете, что полный круг соответствует 1
, и ничего не соответствует 0
, вы можете создать дугу, которая s
раз (например, 3/8), вы можете просто написать:
float theta = 2.0f * PI * s * float(ii) / float(num_segments);
Обратите внимание, что вам может не потребоваться, чтобы дуга начиналась с угла 0. Поэтому вы можете добавить константу, которая также является стартовым углом к этой формуле:
float theta = 2.0f * PI * s * float(ii) / float(num_segments) + start;
Другим решением будет вместо вычисления углов внутри дуги, вы получите начальный и конечный углы и размер шага. Затем у вас есть:
for (theta = start; theta < end; theta += step)
и убедитесь, что в конце вашего GL_LINE_STRIP
вы выполняете glVertex2f
из theta
, соответствующий углу end
, чтобы закончить дугу правильно.
Из ваших комментариев к другому ответу, кажется, что вы действительно ищете другие кривые, такие как кривые безье или сплайны или другие .