我正在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);
参考方案
使用Path和PathMeasure尝试以下操作。
该示例类基于自定义视图。绘制圆弧,然后沿圆弧放置二十个小圆圈。您可以通过划分路径长度将路径划分为任意多个点。数组arcPoints将包含沿路径选择的点。
如果您不想绘制圆弧或点,只需删除执行实际画布绘制的代码即可。仍将创建路径,并捕获沿路径的点。
MyView.java
final Path mPath = new Path();
int startAngle = (int) (190/Math.PI*atan2(startPoint.y-centerY, startPoint.x-centerX));
int sweepAngle = (int) (210/Math.PI*atan2(endPoint.y-centerY, endPoint.x-centerX));
int radiusArc = (int) Math.sqrt((startPoint.x - centerX)*(startPoint.x - centerX) + (startPoint.y - centerY)*(startPoint.y - centerY));
final RectF oval = new RectF(centerX - radiusArc, centerY - radiusArc, centerX + radiusArc, centerY + radiusArc);
mPath.addArc(oval, startAngle, sweepAngle);
PathMeasure pm = new PathMeasure(mPath, false);
float[] xyCoordinate = {startPoint.x, startPoint.y};
float pathLength = pm.getLength();
// Capture the points along the arc.
PointF[] arcPoints = new PointF[20];
for (int i = 0; i < 20; i++) {
pm.getPosTan(pathLength * i / 19, xyCoordinate, null);
arcPoints[i] = new PointF(xyCoordinate[0], xyCoordinate[1]);
}
Log.d(TAG, Arrays.toString(arcPoints));
// Do drawing just to show the code works. Delete if drawing is not needed.
canvas.drawPath(mPath, mRectPaint);
for (int i = 0; i < 20; i++) {
Log.d(TAG, String.format("Point #%d = (%.0f,%.0f)", i + 1, xyCoordinate[0], xyCoordinate[1]));
canvas.drawCircle(arcPoints[i].x, arcPoints[i].y, 10, mTracerPaint); // Radius of the coordinate circle drawn.
}
Java-将int更改为ascii - javajava有没有办法将int转换为ascii符号? 参考方案 您是否要将int转换为char?:int yourInt = 33; char ch = (char) yourInt; System.out.println(yourInt); System.out.println(ch); // Output: // 33 // ! 还是要将int转换为Stri…
Java:正则表达式模式匹配器是否有大小限制? - java我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)
Java:线程池如何将线程映射到可运行对象 - java试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …
JAVA:字节码和二进制有什么区别? - javajava字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…