这是我目前的代码
Path path_eclipse = new Path();
float radius = (float) (Math.sqrt(Math.pow(r.stopX - r.startX, 2.0f) + Math.pow(r.stopY - r.startY, 2.0f)) / 2.0f);
path_eclipse.addCircle(r.startX, r.startY, radius, Path.Direction.CCW);
canvas.drawPath(path_eclipse, paint);
使用此代码我得到输出:
但我想画这样的圆圈:
更新源代码:此源代码适用于我的情况 [解决]
[OnDraw中]
@Override
protected void onDraw(Canvas canvas) {
Path path_eclipse = new Path();
float centerX = (r.startX + r.stopX) /2;
float centerY = (r.startY + r.stopY) /2;
float radius = (float)Math.sqrt((r.stopX - r.startX)*(r.stopX - r.startX)+(r.stopY - r.startY)*(r.stopY - r.startY));
path_eclipse.addCircle(centerX, centerY, radius/2, Path.Direction.CCW);
canvas.drawPath(path_eclipse,paint);
}
[的onTouchEvent]
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = eventX;
startY = eventY;
return true;
case MotionEvent.ACTION_MOVE:
stopX = eventX;
stopY = eventY;
break;
case MotionEvent.ACTION_UP:
stopX = eventX;
stopY = eventY;
break;
default:
return false;
}
invalidate();
return true;
}
答案 0 :(得分:1)
中点
int mx=(r.stopX + r.startX)/2;
int my= (r.stopy+r.startY)/2;
半径
float radius = Math.sqrt(Math.pow(r.stopX - my, 2)
+ Math.pow(r.stopY - my, 2));
<强>被修改强>
我使用了以下代码
public class CustomView extends View {
private Paint paint;
private Circle circle;
private List<Point> points;
public final int CIRCLE_BETWEEN_TWO_POINTS = 1;
private int viewType;
{
paint = new Paint();
points = new ArrayList<>();
}
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
switch (viewType) {
case CIRCLE_BETWEEN_TWO_POINTS:
drawView(canvas);
break;
}
}
private void drawView(Canvas canvas){
for(Point point:points){
drawCircle(canvas,new Circle(point.x,point.y,10),false);
}
drawCircle(canvas,circle,true);
}
private void drawCircle(Canvas canvas,Circle circle, boolean isStroke){
paint.reset();
paint.setAntiAlias(true);
if(isStroke){
paint.setStrokeWidth(5);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
}else {
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
}
canvas.drawCircle(circle.getX(), circle.getY(), circle.getRadius(), paint);
}
public void drawCircleBetweenTwoPoints(int x1, int y1, int x2, int y2) {
viewType = CIRCLE_BETWEEN_TWO_POINTS;
points.clear();
points.add(new Point(x1, y1));
points.add(new Point(x2, y2));
int mx = (x1 + x2) / 2;
int my = (y1 + y2) / 2;
double radius = Math.sqrt(Math.pow(x1 - mx, 2)
+ Math.pow(y1 - my, 2));
circle=new Circle(mx,my,(int)radius);
invalidate();
}
}
将方法称为
customView.drawCircleBetweenTwoPoints(500,200,100,600);
它为我工作
答案 1 :(得分:0)
addCircle
的前两个paramateres是中心的x和y坐标。假设A和B在您想要的圆上距离彼此最远,则中心应该与两者等距,因此:
float centerX = (pointA.x + pointB.x) /2
float centerY = (pointA.y + pointB.y) /2
你的半径应该是A和B之间的距离,因此:
float radius = (Math.sqrt(Math.pow(x2−x1) + Math.pow(y2−y1))) / 2
答案 2 :(得分:0)
如果你想画这样的圆圈,你必须知道3个点,然后用半径计算中心。因为两点不能唯一地确定一个圆。您只能找到整个可能的中心线。
另一方面,如果我们认为两点完全相反。然后你应该用中点公式计算中心:
M = [(x1 + x2 / 2),(y1 + y2 / 2)]
接下来,你可以做与第一种情况相同的事情。首先,计算半径,然后绘制圆圈。
答案 3 :(得分:0)
假设 A 和 B 彼此完全相反,由它们定义的线段将通过圆的中心( C < / strong>),后者将 AB 减半。
因此:
然后计算两点的距离,然后除以2。所以你将拥有半径。
圆圈的中心恰好位于两者的中间位置:x=(x1+x2)/2
和y=(y1+y2)/2
。
如果它们恰好是随机点,您可以使用以下技巧之一:
在这种情况下,你的问题有点棘手,因为两个点和半径不能明确地确定一个圆:问题将有两个解决方案。