C ++ / OpenGL - 2D - Как обрезать круг в прямоугольнике - PullRequest
2 голосов
/ 31 марта 2012

Мне было просто интересно, как бы я обрезал круг в прямоугольной рамке? В настоящее время я использую алгоритм Коэна – Сазерленда для отсечения строк в моей программе, и до сих пор мне удавалось получать прямоугольники и многоугольники для обрезки. Тем не менее, я не знаю, как бы это сделать, для отсечения круга. Я использую следующее, чтобы построить свой круг:

glBegin(GL_POLYGON);
double radius = 50;  
for(int angle = 0; angle <= 360; angle++ ){
    float const curve = 2 * PI * (float)angle / (float)360;
    glVertex2f(point.x + sin(curve) * radius, point.y + cos(curve) * radius);
}
glEnd();

Мой алгоритм отсечения такой же, как здесь: http://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm. Однако он возвращает 2 точки, представляющие новую линию, которая позже будет использоваться для рисования обрезанной фигуры. В общем, я попытался сделать это:

line Lines[360] // an array with size 360 with data type line, which is a struct holding two points (x1, y1, x2, y2) of the new line returned by my clipping function.

double radius = 50;
for(int angle = 0; angle < 360; angle++){
    float const currentCurve = 2 * PI * (float)angle / (float)360;
    float const nextCurve = 2 * PI * (float)(angle+1) / (float)360;
    int x1 = (int)(point[i].x + sin(currentCurve) * radius); // point is another struct holding only a single point. 
    y1 = (int)(point[i].y + cos(currentCurve) * radius);
    x2 = (int)(point[i+1].x+ sin(nextCurve) * radius);
    y2 = (int)(point[i+1].y + cos(nextCurve) * radius);=
    // Clip the points with the clipping algorithm:
    Lines[i] = Clipper(x1, y1, x2, y2);
}

// Once all lines have been clipped or not, draw:

glBegin(GL_POLYGON);
for(int i = 0; i < 360; i++){
    glVertex2f(Lines[i].x1, Lines[i].y1);
    glVertex2f(Lines[i].x2, Lines[i].y2);
}
glEnd();

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

В любом случае, с учетом вышеизложенного мой круг не рисует обрезанное (или вообще рисует), и мое приложение вылетает после нескольких щелчков мыши.

1 Ответ

0 голосов
/ 31 марта 2012

Воспользуйтесь тестом ножниц - прочитайте описание glScissor (): http://www.opengl.org/sdk/docs/man/xhtml/glScissor.xml

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