绘制带有线条的圆圈并检查鼠标是不是在圆圈内 - Java Graphics- Geometry

Posted

技术标签:

【中文标题】绘制带有线条的圆圈并检查鼠标是不是在圆圈内 - Java Graphics- Geometry【英文标题】:Draw circle with lines in it and check if mouse is inside the circle- Java Graphics- Geometry绘制带有线条的圆圈并检查鼠标是否在圆圈内 - Java Graphics- Geometry 【发布时间】:2021-08-11 00:30:26 【问题描述】:

使用Java图形,我尝试画一个圆,在里面画线,然后检查鼠标是否在圆内并打印鼠标的位置。

我绘制的线条超出了圆圈,当我在这些线条的边界内单击但在圆圈之外时,它假定鼠标在圆圈内,因为我给 x 和 y 的限制实际上形成了一个正方形。 this is how my circle looks like

如何找到 x 和 y 的限制,使线条不会超出圆圈,并且只有当鼠标在圆圈内时才会打印“内部”?

this is how it should actually look like

这是我的代码

public class Circle extends JFrame implements MouseListener 
    
    int x,y,i;
    JLabel label =new JLabel();


    public void SetLayout(int x, int y, int w, int l, Component c)
        c.setLocation(x, y);
        c.setSize(w, l);
    
    
    public Circle()
       
            Container con = getContentPane();
            setLayout(null);
            SetLayout(10, 10, 70, 20, label);
            con.add(label); 
            this.setSize(1000,500);
            this.setResizable(false);
            this.setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            addMouseListener(this); 
    
    public void paint(Graphics g)
    
        super.paint(g);
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 1000, 1000);
        g.setColor(Color.BLACK);   
        
        g.drawOval(300,50,400,400);

        g.setColor(Color.cyan);       
        for (i = 2 ; i < 400 ; i += 5)
              g.drawLine(300+i, 50 , 300+i, 450);
        
                
        g.setColor(Color.BLACK);    
                label.setText( ((double)x-500)/100+"  "+((double)y-250)/-100 );
                
        g.drawLine(0, 250, 1000, 250);
        g.drawLine(500, 0, 500, 500);
        g.drawString("(0,0)",501,265);
        g.drawString("1",601,265); 
        g.drawString("-1",401,265); 
        g.drawString("2",701,265); 
        g.drawString("-2",301,265); 
        g.drawString("3",801,265); 
        g.drawString("-3",201,265); 
        g.drawString("1",503,165);
        g.drawString("-1",503,365);
        g.drawString("2",503,65);
        g.drawString("-2",503,465);
             
    
    @Override
    public void mouseClicked (MouseEvent e) 
        x = e.getX();
        y = e.getY();       
        
        if ((y >= 50 && y <= 450 && x >= 300) & x <= 700)
                    JOptionPane.showMessageDialog(null, "Inside");
                    
                else
                    JOptionPane.showMessageDialog(null, "Outside");
                
                    
                repaint();
    
        
    public static void main(String[] args) 
        // TODO Auto-generated method stub
        new Circle();
    
        
    @Override
    public void mouseEntered(MouseEvent arg0)  
        
    @Override
    public void mouseExited(MouseEvent arg0)   
        
    @Override
    public void mousePressed(MouseEvent arg0) 
    
    @Override
    public void mouseReleased(MouseEvent arg0) 
        

也许可以有一个解决方案,比如计算点击点到中心的距离并检查距离是否小于半径。但是,这并不能解决超出线的问题。

【问题讨论】:

【参考方案1】:

使用三角函数: 通过使用反余弦函数,您可以获得 x 轴与该 x 坐标的圆上点之间的角度。然后通过将该角度插入 sin 函数,您可以得到该点在圆上的 y 位置。

Point circleCenter;
int radius;
int lineDistance;


for (int x = -radius; x < radius; x += lineDistance) 

    float double = Math.acos(x / radius);

    int y = Math.sin(angle) * radius;

    int top = circleCenter.y + y;
    int bottom = circleCenter.y - y;


    g.drawLine(x + circleCenter.x, top, x + circleCenter.y, bottom);


如果你有时间,不如研究一下三角学 https://www.mathsisfun.com/algebra/trigonometry.html 这确实是一个引人入胜的主题,对任何程序员来说都是必不可少的。

检查鼠标是否在圆圈内:

Point mousePosition;
Point circleCenter;
int radius;

Point centerToMouse = new Point(mousePosition.x - circleCenter.x, mousePosition.y - circleCenter.y);

bool mouseInside = (int)Math.sqrt(centerToMouse.x * centerToMouse.x + centerToMouse.y * centerToMouse.y) <= radius;

【讨论】:

以上是关于绘制带有线条的圆圈并检查鼠标是不是在圆圈内 - Java Graphics- Geometry的主要内容,如果未能解决你的问题,请参考以下文章

检查点是不是在圆圈内

使用带有google maps api v3的addresspiquer在地图中绘制圆圈

使用 python 在打开的 cv 中使用鼠标事件绘制矩形或线条

unity游戏unity 攻击范围绘制圆圈怎么做

在 UIView 框架内绘制圆圈

在python中创建圆圈以遮盖图像并计算每个圆圈内的像素