如何获得该单击是在形状中或在shap之外。

时间:2014-11-22 18:53:13

标签: java matlab logic

我需要让程序有一个三角形,当我点击三角形消息框时会显示"在三角形"如果在外面点击,那么"在三角形之外"

有三角形代码并获得点击坐标。但我不能在上面提到那个提到的逻辑。

如果有更好的方法来绘制三角形,那么请告诉我。 或者如果这项工作在matlab中很容易,那么也建议我。

第1类绘制三角形

public class Triangle extends JComponent  
    {  
       public void paintComponent(Graphics g)  
        {  
            Graphics2D g2 = (Graphics2D) g;  
            g2.draw(new Line2D.Double (100, 100, 200, 100));  
            g2.draw(new Line2D.Double (100, 100, 150, 200));
            g2.draw(new Line2D.Double (150, 200, 200, 100));
                 }  
        }

第2课

public class Tri_Angle extends MouseAdapter {        
Tri_Angle(){
      addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent me) { 
      int x= me.getX();
      int y=     me.getY();
      System.out.println("clicked at (" + x + ", " + y + ")");
      } 
    });
}


public static void main(String[] args) {
    Triangle component = new Triangle ();  
    JFrame frame = new JFrame ();         
    final int FRAME_WIDTH = 250;  
    final int FRAME_HEIGHT = 250;  
    frame.setSize (FRAME_WIDTH, FRAME_HEIGHT);         
      frame.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent me) { 
         int x= me.getX();
         int y= me.getY();
         System.out.println("clicked at (" + x + ", " + y + ")");
      } 
    });
    frame.setTitle("A Test Frame");  
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    frame.setVisible(true);  
    frame.add(component); 
}

1 个答案:

答案 0 :(得分:0)

这很简单。

  • 取三角形顶点:p1(100,100),p2(200,100),p3(150,200);
  • 恢复每一行的线方程;
  • 对于点击坐标,相反线函数的每个三角形顶点符号应该相同。

Java代码:

public class Point {
    public final double x;
    public final double y;
    ...
}

// -1 - point is "below" line, 0 - point is on line, +1 - point is "above" line
private int getPointPosition(Point p, Point p1, Point p2) {
    // Line equation: (p.x - p1.x) / (p1.x - p2.x) - (p.y - p1.y) / (p1.y - p2.y)) = 0
    // Canonical form: F = Ax + By + C
    return Double.sign((p.x - p1.x) * (p1.y - p2.y) - (p.y - p1.y) * (p1.x - p2.x));
}

private boolean isInTriangle(Point p, Point p1, Point p2, Point p3) {
    return getPointPosition(p, p1, p2) == getPointPosition(p3, p1, p2) &&
        getPointPosition(p, p1, p3) == getPointPosition(p2, p1, p3) &&
        getPointPosition(p, p2, p3) == getPointPosition(p1, p2, p3);
}

为了更好地理解这个数学,你可以在纸上画一个图像并用方程式进行游戏。