Как нарисовать дугу в opengl? [Дубликат]

Как предложил Йохахим Исакссон в комментариях, теперь у меня есть метод SetData(Data data) и используйте его следующим образом:

MyPage1?.SetData(this.data);
MyPage2?.SetData(this.data);
MyPage3?.SetData(this.data);
-4
задан Christian Rau 13 November 2012 в 14:50
поделиться

2 ответа

Не обязательно лучший способ, но если вам просто нужно что-то сделать, вы можете немного изменить свой код круга. Добавьте параметр функции 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
ответ дан rlkw1024 19 August 2018 в 18:54
поделиться
  • 1
    Спасибо за письмо Jarrett. Ваше решение очень интересно, но как я могу установить угол дуги? – Saman Gholami 12 November 2012 в 22:33
  • 2
    Параметр arc_length, который я предложил, подходит именно для этого. – rlkw1024 13 November 2012 в 00:32
  • 3
    Когда я меняю arc_length, дуга рисует как неполный круг, но я хочу установить угол, который больше не похож на круг – Saman Gholami 13 November 2012 в 01:19
  • 4
    «Дуга рисует как неполный круг» - это определение дуги. Возможно, вы думаете о другой геометрической форме? – rlkw1024 13 November 2012 в 07:01
  • 5
    Да, что-то вроде кривой, но с GL_LINE – Saman Gholami 13 November 2012 в 16:22

У вас разные решения, основанные на том, как вы рисуете свой круг. В настоящее время то, что вы делаете, состоит в том, чтобы разделить 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, чтобы закончить дугу правильно.


Из ваших комментариев к другому ответу, кажется, что вы действительно ищете другие кривые, такие как кривые безье или сплайны или другие .

0
ответ дан Shahbaz 19 August 2018 в 18:54
поделиться
  • 1
    Спасибо, что написал Shahbaz.i, думаю, мне нужно реализовать Spline, но я ограничился использованием Line и Line_Loop ... – Saman Gholami 13 November 2012 в 23:30
  • 2
    @SamanGholami, сплайны также нарисованы с помощью GL_LINE_STRIP. Важным является вычисление вершин. Вам нужно будет искать алгоритмы рендеринга сплайнов, желательно из книги по компьютерной графике. – Shahbaz 14 November 2012 в 02:00
  • 3
    Да, я могу использовать GL_LINE_STRIP, не могли бы вы помочь мне найти ссылку? – Saman Gholami 14 November 2012 в 09:58
  • 4
    Как насчет поиска google для алгоритма рисования сплайна opengl ?? Третье звено, например, представляет собой слайды из карнегированной дыни. – Shahbaz 14 November 2012 в 15:01
  • 5
    Спасибо Shahbaz.этой ссылкой использовали glVertex3, но я ограничился использованием glVertex2.i должен создать проект для университета, и я должен нарисовать 2-мерную мультяшную форму, такую ​​как Гарфилд, и мы ограничены использованием glVertex2.i попытаемся создать некоторые функции и использовать их для все больше и больше. Какова ваша идея? – Saman Gholami 14 November 2012 в 15:52
Другие вопросы по тегам:

Похожие вопросы: