java - 通过中点算法在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();
}
}
另外,我希望这个圆圈不被颜色填充
另外,任何人都可以帮助我并告诉我如何用相同的算法绘制椭圆
解决方案
第二个四边形的顶点顺序存在问题。您必须交换第 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();
推荐阅读
- oracle - RPD 的变化未显示在 OBIEE 中
- asp.net - 我想获得选定的单选按钮值
- c# - 即使不使用 RedirectStandardError/RedirectStandardOutput,Process.WaitForExit 也会挂起
- ansible - Ansible 和 Jinja2 变量组合
- c++ - 未找到函数 setenv()?
- java - JPA 数据库连接问题
- spring-boot - 无法连接到 datastax cassandra
- php - PHP Mysql查询优化报告
- spring-mvc - 在角度为 5 的下拉菜单中显示来自远程服务器的文件列表
- bash - Shell 脚本从文件中获取日期部分,然后将其与过去 2 天进行比较