2017-02-07 52 views
1

这是我当前的代码Android:如何在两点内绘制圆?

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; 
} 
+0

将您的半径是2,中心是2分 –

+0

之间的线的中间那两个正好相反?或者他们只是圈上的两点? – Dan

+0

你好,这是从onTouch事件得到的两点。 – Nicky

回答

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 
+0

不知道'r','r.startX'和'r.startY'是什么,这就是我可以说的 –

+0

你好,我添加了更多的源代码,已经尝试了你的解决方案,但是x,y坐标是错误的。 path_eclipse.addCircle(centerX,centerY,radius,Path.Direction.CCW); 这是结果:https://youtu.be/tT4RlQ_XWGc 谢谢。 – Nicky

0

如果你想画这样的圆,你必须知道3点,然后用半径计算中心。因为两点不能唯一确定一个圆。你只能找到所有可能的中心。

另一方面,如果我们认为两点完全相反。然后,你应该通过中点公式计算中心:

M = [(X1 + X2/2),(Y1 + Y2/2)]

接下来,可以做同样的事情,在第1壳体。首先,计算半径,然后绘制圆。

0

假设,即被准确彼此相对,由它们所限定的线段将穿过圆(Ç)的中心,而后者将削减AB在半。

因此:

你计算两点的距离,然后除以二。所以你会有半径。

圆的中心将在两者之间的正中间:x=(x1+x2)/2y=(y1+y2)/2

如果他们碰巧只是随机的点,你可以使用这些技术之一:

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

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

+0

你好,我遵循你的解决方案,但仍然无法工作,我认为这是因为这个代码。 path_eclipse.addCircle(mx,my,radius,Path.Direction.CCW); 以下是结果:youtu.be/tT4RlQ_XWGc 谢谢 – Nicky