如何识别三角形上的触摸?
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);
}
我正在尝试识别我手指的 (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);
}