2012-06-21 64 views
37

私は今、私は2点間の円弧を描きたいこのコード キャンバス上の2点間にアークを描画する方法は?

canvas.drawLine(p1.x, p1.y, p2.x, p2.y, paint); enter image description here

使用することで、この下の画像のように、これらの点の間に線を引くことができるよ、キャンバスに2点を持っています下の画像のように。

enter image description here

は、どのように私はこのように描くことができます。

+0

http://stackoverflow.com/questions/4196749/draw-arc-with-2-points-and-center-of-the-circle – vajapravin

+0

@vajapravin私はそれを試してみましたが、それらの機能は利用できませんアンドロイドのキャンバスのために。 –

+0

私たちはアンドロイドでこの機能を持っています:drawArc(RectF、float、float、boolean、Paint); –

答えて

43

最後に、私はこのコードから解決策だ:startAngleを計算するには

float radius = 20; 
final RectF oval = new RectF(); 
oval.set(point1.x - radius, point1.y - radius, point1.x + radius, point1.y+ radius); 
Path myPath = new Path(); 
myPath.arcTo(oval, startAngle, -(float) sweepAngle, true); 

を、このコードを使用します。ここ

int startAngle = (int) (180/Math.PI * Math.atan2(point.y - point1.y, point.x - point1.x)); 

point1をアークの描画を開始したい場所を意味します。 sweepAngleは、2本の線の間の角度を意味します。質問画像の青い点のような2点を使って計算しなければなりません。

+4

sweeep_angleはどういう意味ですか? –

+0

ここでsweep_angleは2つの線の間の角度を意味し、2つの点を使用して計算する必要があります。これは、Question画像の青い点のようなコーナー間の最短点です。 –

+0

ありがとうございます! :) –

17

このような何か:

@Override 
protected void onDraw(Canvas canvas) {  
    Paint p = new Paint(); 
    RectF rectF = new RectF(50, 20, 100, 80); 
    p.setColor(Color.BLACK); 
    canvas.drawArc (rectF, 90, 45, true, p); 
} 
+0

私はそれらの2点の間に弧を描画する必要があります –

+0

開始角度と掃引角度を指定する必要があります。[docs here](http://developer.android.com/reference/android/graphics/Canvas.html) –

+0

ポイント間の角度が動的に変化し、これらの点も。 –

3

私は少し違うことをしようとしていましたが、それはすべてスイープとスタートアングルを計算することです。

上から下に向かう円の進行を表す円を表示したかったのです。

だから私は0 ... 100から進捗値を持っていたと私は進歩が、私が使用しsweepAngleを計算するには100

ときに円を埋めるために上から下にアークスタートを見せたい:

int sweepAngle = (int) (360 * (getProgress()/100.f)); 

次はstartAngleの

int startAngle = 270 - sweepAngle/2; 

スタート角度があるため、この方法で計算される計算することです:

  1. 常に上から下に向かって左から開始します。したがって、上の開始角度は270になります(時計回りに0時= 3時、12時は270度になることに注意してください)
  2. 次は、私がどこから離れるのかを計算したい弧の半分だけが左側に、残りの半分が右側にあるので、掃引角度の半分を計算するだけです。

だからあなただけの270を交換する必要があります(..などを左に右に左、右)私は25%の進捗

sweepAngle = 90 degrees (90 degrees is quarter of a circle) 
start angle = 225 (45 degrees away from 270) 

にあなたが進歩が、他の側面から行きたい場合があります考慮します開始角度で。

0

ドローアークのサンプル。

public static Bitmap clipRoundedCorner(Bitmap bitmap, float r, boolean tr, boolean tl, boolean bl, boolean br) 
{ 
    int W = bitmap.getWidth(); 
    int H = bitmap.getHeight(); 

    if (r < 0) 
     r = 0; 

    int smallLeg = W; 

    if(H < W) 
     smallLeg = H; 

    if (r > smallLeg) 
     r = smallLeg/2; 

    float lineStop = r/2; 

    Path path = new Path(); 
    path.moveTo(0,0); 

    if(tr) 
    { 
     path.moveTo(0, lineStop); 
     path.arcTo(new RectF(0,0, r,r), 180, 90, false); 
    } 

    path.lineTo(W-lineStop, 0); 

    if(tl) 
     path.arcTo(new RectF(W-r,0, W,r), 270, 90, false); 
    else 
     path.lineTo(W, 0); 

    path.lineTo(W, H-lineStop); 

    if(bl) 
     path.arcTo(new RectF(W-r,H-r, W,H), 0, 90, false); 
    else 
     path.lineTo(W, H); 

    path.lineTo(lineStop, H); 

    if(br) 
     path.arcTo(new RectF(0,H-r, r,H), 90, 90, false); 
    else 
     path.lineTo(0,H); 

    if(tr) 
     path.lineTo(0,lineStop); 
    else 
     path.lineTo(0,0); 


    Bitmap output = Bitmap.createBitmap(W, H, Config.ARGB_8888); 
    Canvas canvas = new Canvas(output); 
    final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

    paint.setColor(Color.BLACK); 
    canvas.drawPath(path, paint); 

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
    canvas.drawBitmap(bitmap, 0, 0, paint); 

    return output; 
} 
関連する問題