如何识别三角形上的触摸?

How to recognize touch on a triangle?

我正在尝试识别我手指的 (x,y) 是否接触到三角形对象的任何部分。

三角形是这样画的

    public void drawTriangle(Canvas canvas, Paint paint, int x, int y, int width) {
        int halfWidth = width / 2;

        Path path = new Path();
        path.moveTo(x, y - halfWidth); // Top
        path.lineTo(x - halfWidth, y + halfWidth); // Bottom left
        path.lineTo(x + halfWidth, y + halfWidth); // Bottom right
        path.lineTo(x, y - halfWidth); // Back to Top
        path.close();

        canvas.drawPath(path, paint);
    }

这是我在屏幕上绘图的方式 + 我如何识别其他形状(如正方形和圆形)的示例:

       public boolean onTouchEvent(MotionEvent event) {

            int X = (int) event.getX();
            int Y = (int) event.getY();
            int eventaction = event.getAction();
            switch (eventaction) {
                /*
                case MotionEvent.ACTION_DOWN:
                    Toast.makeText(this, "ACTION_DOWN AT COORDS "+"X: "+X+" Y: "+Y, Toast.LENGTH_SHORT).show();
                    isTouch = true;
                    break;

                 */

                case MotionEvent.ACTION_MOVE:
                    {
                        int s = triangle.getY() * triangle.getWidth()/ triangle.getY()-triangle.getWidth()/2;

                        if(X>=circle.getX()-circle.getRadius()&&X<=circle.getX()+circle.getRadius()
                        &&Y>=circle.getY()-circle.getRadius()&&Y<=circle.getY()+circle.getRadius()) {
                            circle.setX(X);
                            circle.setY(Y);
                            //square.setX(X);
                            //square.setY(Y);

                        }
                        if(X < square.getX() + square.getWidth() && X + square.getWidth() > square.getX() &&
                                Y < square.getY() + square.getHeight() && Y + square.getHeight() > square.getY())
                        {

                            square.setX(X);
                            square.setY(Y);

                        }
                        if(//triangle help)
                        {
                            triangle.setX(X);
                            triangle.setY(Y);
                        }
                    break;
                }
                
            }
            return true;
        }

以下是我要识别它们的方法:

1- 我绘制的每个形状都会将其坐标保存在一个列表中(例如:一个圆有一个圆心和一个半径)。这些坐标可以帮助您确定给定的触摸坐标是否正在触摸形状。如果您想知道形状的类型,可以使用形状列表。

2-每当你触摸canvas的一部分时,你会得到这个触摸部分的坐标,然后遍历保存的形状并检查坐标是否为on/in(抱歉我是法语)形状。所以现在的事情是你必须检查算法,让你知道什么时候 coordinate/point 是 on/in 一个形状。

Source link伪代码解

有多种方法可以检查点是否在三角形内或三角形外。

假设三角形的每个顶点都有内侧和外侧。内部是三角形内部的那个,外部因此是三角形外部的。

要检查一个点是否在三角形内部,我们可以检查该点是否在每个三角形顶点的内侧。 注意:此解决方案可能需要您进行一些小改动,因为我不知道您的三角形的确切结构 class。

public boolean onTouchEvent(MotionEvent event) {

            int X = (int) event.getX();
            int Y = (int) event.getY();
            int eventaction = event.getAction();
            switch (eventaction) {
case MotionEvent.ACTION_MOVE:
                    {
                        ...

                        int halfWidth = triangle.getWidth()/2;
                        Pair<Integer, Integer> v1 = new Pair(triangle.getX(), triangle.getY() - halfWidth);
                        Pair<Integer, Integer> v2 = new Pair(triangle.getX() - halfWidth, triangle.getY() + haldWidth);
                        Pair<Integer, Integer> v3 = new Pair(triangle.getX() + halfWidth, triangle.getY() + halfWidth);
                        if (isPointInTriangle(x, y, v1, v2, v3)) {
                            // point is inside of a triangle
                        }
                    break;
                }
                
            }
            return true;
}

private int sign(int x, int y, Pair<Integer, Integer> vertex1, Pair<Integer, Integer> vertex2) {
    return (x - vertex2.first) * (vertex1.second - vertex2.second) - (vertex1.first - vertex2.first) * (y - vertex2.second);
}

private boolean isPointInTriangle(int x, int y, Pair<Integer, Integer> vertex1, Pair<Integer, Integer> vertex2, Pair<Integer, Integer> vertex3)
{
    int r1 = sign(x, y, vertex1, vertex2);
    int r2 = sign(x, y, vertex2, vertex3);
    int r3 = sign(x, y, vertex3, vertex1);

    boolean hasNegative = (r1 < 0) || (r2 < 0) || (r3 < 0);
    boolean hasPositive = (r1 > 0) || (r2 > 0) || (r3 > 0);

    return !(hasNegative && hasPositive);
}