Android:如何在两点内绘制圆圈?

时间:2017-02-07 08:58:03

标签: android canvas

这是我目前的代码

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);

使用此代码我得到输出:

enter image description here

但我想画这样的圆圈:

enter image description here

更新源代码:此源代码适用于我的情况 [解决]

[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;
}

4 个答案:

答案 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);

它为我工作

Click to see output

答案 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)/2y=(y1+y2)/2

如果它们恰好是随机点,您可以使用以下技巧之一:

在这种情况下,你的问题有点棘手,因为两个点和半径不能明确地确定一个圆:问题将有两个解决方案。