首页 > 解决方案 > 通过中点算法在java中绘制圆圈

问题描述

我正在尝试使用中点算法在 java 中绘制一个圆,但是这段代码没有给我一个明确定义的圆,有些点向下,有些点向上,所以我想在此定义明确的圆

import static org.lwjgl.opengl.GL11.*;

import java.util.ArrayList;
import java.util.Random;

import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

import assginment4.Graphics;

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
    
    
public class input {

    
    void circle (i`nt xc, int yc, int r`) //xc and yc is the center of circle and r is radius
    {
        int x,y,d;
        d=1-r;
        x=0;
        y=r;
        glBegin(GL_QUADS);
        while(x<=y)
        {
            
            glVertex2f(x+xc, y+yc);
            glVertex2f(x+xc, -y+yc);
            glVertex2f(-x+xc, y+yc);
            glVertex2f(-x+xc, -y+yc);
            
            glVertex2f(y+xc, x+yc);
            glVertex2f(y+xc, -x+yc);
            glVertex2f(-y+xc, x+yc);
            glVertex2f(-y+xc, -x+yc);
            if(d>0)
            {
                x+=1;
                y-=1;
                d+=1+2*x+1-2*y-1;
            }
            else
            {
                x++;
                d+=2*x+1;
            }
        }
        glEnd();
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            Display.setDisplayMode(new DisplayMode(640, 480));
            Display.setTitle("Input Demo");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            Display.destroy();
            System.exit(1);
        }
       
        
        
        glMatrixMode(GL_PROJECTION);
        glOrtho(0, 640, 480, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        
        while (!Display.isCloseRequested()) {

            
            if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
                Display.destroy();
                System.exit(0);
            }
            

            input d1 = new input();
            
                
                if(Mouse.isButtonDown(0)) {
                    d1.circle(Mouse.getX(), 480-Mouse.getY(), 50);
                
                }
                
                
                Display.update();
                Display.sync(60);
            
        }
        
        Display.destroy();
    }
}

另外,我希望这个圆圈不被颜色填充

另外,任何人都可以帮助我并告诉我如何用相同的算法绘制椭圆

标签: javaopenglgraphics

解决方案


第二个四边形的顶点顺序存在问题。您必须交换第 3 和第 4 个顶点坐标:

glVertex2f(y+xc, x+yc);
glVertex2f(y+xc, -x+yc);
glVertex2f(-y+xc, -x+yc);
glVertex2f(-y+xc, x+yc);        

如果要绘制圆形轮廓,则需要使用原始类型GL_POINTS而不是GL_QUADS

glBegin(GL_POINTS);
while (x <= y) {
    
    glVertex2f(x+xc, y+yc);
    glVertex2f(x+xc, -y+yc);
    glVertex2f(-x+xc, y+yc);
    glVertex2f(-x+xc, -y+yc);
    
    glVertex2f(y+xc, x+yc);
    glVertex2f(y+xc, -x+yc);
    glVertex2f(-y+xc, -x+yc);
    glVertex2f(-y+xc, x+yc);

    if (d > 0) {
        x += 1;
        y -= 1;
        d += 1 + 2*x + 1 - 2*y -1;
    }
    else {
        x ++;
        d += 2*x + 1;
    }
}
glEnd();


推荐阅读