好的亲爱的朋友们,我有这个问题,我真的不知道某种解决方法。 我在java中做的是“Paint应用程序”,我知道一切准备就绪,但我需要用计算机图形算法绘制形状。
所以,问题是,一旦在容器中绘制了形状,我怎么能像对象一样转换它以便能够选择形状并移动它(我必须用另一种算法移动它)我只是想知道我怎么知道在屏幕上点击的一些随机点属于一个对象,知道,我可以填充它(使用算法)。
我想有一个Point类和一个形状类,如果我点击屏幕,获取坐标并查看所有形状和它们的点,但这可能效率不高。 有什么想法吗? 谢谢您的帮助。 以下是我的一些代码:
public class Windows extends JFrame{
private JPanel panel;
private JLabel etiqueta,etiqueta2;
public Windows() {
initcomp();
}
public void initcomp()
{
panel = new JPanel();
panel.setBounds(50, 50, 300, 300);
etiqueta = new JLabel("Circulo Trigonometrico");
etiqueta.setBounds(20, 40, 200, 30);
etiqueta2 = new JLabel("Circulo Bresenham");
etiqueta2.setBounds(150, 110, 200, 30);
panel.setLayout(null);
panel.add(etiqueta);
panel.add(etiqueta2);
panel.setBackground(Color.gray);
this.add(panel);
this.setLayout(null);
this.setVisible(true);
this.setSize(400,400);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.red);
g2d.setStroke(new BasicStroke(2));
dibujarCirculo_bresenham(g2d, 50, 260, 260);
dibujarCirculo_trigonometrico(g2d, 50, 130, 200);
}
/*This functions paints a Circle*/
public void dibujarCirculo_trigonometrico(Graphics g,int R,int xc,int yc)
{
int x,y;
for (int i = 0; i < 180; i++) {
double angulo = Math.toRadians(i);
x = (int) (Math.cos(angulo)*R);
y = (int) (Math.sin(angulo)*R);
g.drawLine(x+xc, y+yc, x+xc, y+yc);
g.drawLine((-x+xc), (-y+yc), (-x+xc), (-y+yc));
}
}
答案 0 :(得分:0)
我假设任何图像都是有效的(不限于特定的一组形状)。要获得具有类似属性的连续区域,请尝试使用flood fill。
要着色或移动特定形状,您可以使用泛光填充来确定像素集并相应地操纵该组。您可以为类似的色调等设置容差,使其不像Paint中的那样严格,并且变得更像Photoshop中的魔术选择工具。
答案 1 :(得分:0)
根据你想要的具体内容,有几种方法可供选择。
1)要有一个对象,一个用于屏幕上每个绘制的对象,其中包括Circle,Rectangle和Polygon等类。他们会定义像paint这样的方法(如何在屏幕上绘制它们),isCLickInsideOf(在这个形状所包含的屏幕上的这个点,给定大小/位置/等?)等等。然后,重绘屏幕绘制每个对象,并测试是否正在点击一个对象询问每个对象它的想法。
2)是,如果对象具有颜色均匀的属性,则当用户使用填充算法单击其中一个像素时,您可以获取构成形状的所有像素。然后你可以将它们加载到某种数据结构中,当用户移动鼠标时移动它们等等。另外,如果每个对象都保证具有唯一的颜色,你可以通过查看来测试点击哪个对象在颜色。 (像OpenGL这样的库有时会使用这样的技巧来确定你点击的对象 - 将每个对象绘制为隐藏框架上的平面颜色并测试鼠标指针下的像素颜色)