【发布时间】:2020-02-24 08:13:12
【问题描述】:
我正在与Android Studio 中的Canvas.drawArc() 合作,我已经找到了正确绘制我需要的弧线的方法,但我想知道Point() 的坐标,它实际上创建了Arc(不是边缘,而是其中一些在中间)。我已经拥有的代码是:
画弧线(作品)
// Set the arc of movement of the encoder
public void setArc(Canvas canvas, Point startPoint, Point endPoint){
Point centerArc = new Point((int) centerX, (int) centerY);
Point leftEdge = new Point(startPoint.x, startPoint.y);
Point rightEdge = new Point(endPoint.x, endPoint.y);
int radiusArc = (int) Math.sqrt((leftEdge.x - centerArc.x)*(leftEdge.x - centerArc.x) + (leftEdge.y - centerArc.y)*(leftEdge.y - centerArc.y));
int startAngle = (int) (190/Math.PI*atan2(leftEdge.y-centerArc.y, leftEdge.x-centerArc.x));
int endAngle = (int) (210/Math.PI*atan2(rightEdge.y-centerArc.y, rightEdge.x-centerArc.y));
RectF rect = new RectF(centerX - radiusArc, centerY - radiusArc, centerX + radiusArc, centerY + radiusArc);
canvas.drawArc(rect, startAngle, endAngle, true, mRectPaint);
}
问题在于,由于Canvas.drawArc() 是void 方法,我不确定如何获得这些坐标。
有什么建议吗?事实上,我什至对绘制Arc 都不感兴趣。我只是在寻找一种方法来实际获取这些坐标。
也许有一种方法可以在 java 中的 3 个点内创建一条曲线,我可以获得坐标。我不介意使用这种方法。
第一种方法
我已经尝试关注这个answer,但我得到的值不是正确的
// Calculate the coordinates of 100 points of the arc
Point[] coordinatesArc = new Point[100];
coordinatesArc[0] = startPoint;
Point coordinate = new Point();
int xCoordinate;
int yCoordinate;
for (int i = 1; i<=98; i++){
xCoordinate = startPoint.x + radiusArc*(int)Math.sin(i);
yCoordinate = startPoint.y - radiusArc*(1-(int)Math.cos(i));
coordinate.set(xCoordinate, yCoordinate);
coordinatesArc[i]=coordinate;
}
coordinatesArc[99]= endPoint;
Log.d(TAG, "Values: x = " + String.valueOf(coordinatesArc[97].x) + " y = " + String.valueOf(coordinatesArc[97].y) );
第二种方法
我还检查了来自 Android 的 Path,但我不知道是否可以使用它。似乎有两种方法(arcTo 和 addArc)可以提供帮助,但我不知道如何将它附加到画布上,所以我想不可能将它们结合起来。
第三种方法
在找到另一个以前的answer 后,我尝试实现它,但坐标再次错误(甚至不接近我的endPoint)。
Point centerArc = new Point((int) centerX, (int) centerY);
Point leftEdge = new Point(startPoint.x, startPoint.y);
int radiusArc = (int) Math.sqrt((leftEdge.x - centerArc.x)*(leftEdge.x - centerArc.x) + (leftEdge.y - centerArc.y)*(leftEdge.y - centerArc.y));
int startAngle = (int) (190/Math.PI*atan2(leftEdge.y-centerArc.y, leftEdge.x-centerArc.x));
Point[] coordinatesArc = new Point[100];
Point auxPoint = new Point();
coordinatesArc[0] = startPoint;
for(int i = 1; i<=98;i++){
auxPoint.x = (int) (centerX + radiusArc * Math.cos(startAngle + i));
auxPoint.y = (int) (centerY + radiusArc * Math.sin(startAngle + i));
coordinatesArc[i]= auxPoint;
}
coordinatesArc[99]= endPoint;
Log.d(TAG, "COORDINATES ARC: x = " + coordinatesArc[98].x + " & y = " + coordinatesArc[98].y);
【问题讨论】:
-
也许这会对你有所帮助:stackoverflow.com/questions/25935315/…
-
我更愿意将弧线分割成 100 个点,而不是检查一个点是否是弧线的一部分。不知道有没有可能?