有人可以解释一下arcTo的最后两个参数吗?

我试图绘制一个圆angular的矩形。 我有一个JavaScriptpath,这样做,但JavaScript的arcTo方法需要一个矩形(定义其椭圆形),然后一个参数设置扫描。

但是,在Android版本中有三个参数。 矩形椭圆形(我认为我已经正确定义),然后startAngle和sweepAngle(我不明白的用法),但我的弧看起来不像我期待什么,当我面条如何猜猜他们应该工作。

有没有人知道这个好教程?

具体来说,我试图理解,如果我试图从12 – 3绘制一个弧(在一个钟面上),然后假设我有一条线从3跑下来,然后需要从3点到6点,等等。

这里是我的代码(现在忽略那些弧的数字……这只是我猜测这个工作的最新的迭代,在以前的更合理的尝试中失败了):

Path ctx = new Path(); ctx.moveTo(X+5,Y); //A ctx.lineTo(X+W-5,Y);//B ctx.arcTo(new RectF(X+W, Y, X+W, Y+5), -180, 90); //B arc ctx.lineTo(X+W,Y+H-5); //C ctx.arcTo(new RectF(X+W,Y+H,X+W-5,Y+H),90,180); //C arc ctx.lineTo(X+W/2 +6,Y+H); ctx.lineTo(X+W/2,Y+H+8); ctx.lineTo(X+W/2-6,Y+H); ctx.lineTo(X+5,Y+H); ctx.arcTo(new RectF(X,Y+H,X,Y+H-5),180,270); ctx.lineTo(X,Y+5); ctx.arcTo(new RectF(X,Y,X+5,Y),270,0); Paint p = new Paint(); p.setColor(0xffff00ff); canvas.drawPath(ctx, p); 

多谢。

Solutions Collecting From Web of "有人可以解释一下arcTo的最后两个参数吗?"

奇怪的是,没有人接受答案,一旦我find了它(这是不容易find),这是非常简单的。

所以,它的工作方式是这样的:假设你想绘制一个圆angular在12 – 3(使用时钟参考):你开始你的path,当你需要的弧线,你定义了一个矩形的左上angular是地方你的线路当前被终止,而右下angular是弧线要去的地方,所以如果你想象一个X,Y是12(在时钟上),X + W,Y + H是3这是你需要的广场。

现在假设在这个正方形中有一个椭圆(在这个例子中是椭圆形的,如果你希望曲线更加椭圆,那么把你的正方形定义成一个矩形),你可以使用任何一个圆的切片该方法的最后两个参数。 第一个参数定义了你想要开始切割的angular度。 如果我们使用罗盘,0度是东(不知道为什么,我不是一个几何专家…这是正常的吗?我一直认为0是北,但我看到的所有编程几何示例都有0东方,也许有人会评论这是为什么)。

第二个参数定义了你想要的圈数。 如果你想整个圈子,你把360放在一半,如果你想放180圈等

所以在我们这个例子中,因为我们想要从12点到3点,所以我们把270点作为起点,抓住了90度的圈子。

最后,当你完成这个过程时,这条线现在认为是在下午3点,所以你可以从那里继续lineTo(ing)。 所以…这里是我的形状的固定代码(它有一个小三angular形,但是这里也没有,实际的圆形部分是BC,DE,IJ和KA,其余都是直线。

 int arc = 25; public Cursor(int X, int Y, int W, int H){ /* * AB * KC * JD * IHFE G */ int Ax = X+ arc; int Ay = Y; int Bx = X + W - arc; int By = Y; int Cx = X + W; int Cy = Y + arc; int Dx = Cx; int Dy = (Y + arc) + (H - arc*2); int Ex = Bx; int Ey = Y + H; int Fx = X+W/2 +6; int Fy = Ey; int Gx = X+W/2; int Gy = Y+H+8; int Hx = X+W/2-6; int Hy = Ey; int Ix = Ax; int Iy = Hy; int Jx = X; int Jy = Dy; int Kx = X; int Ky = Cy; Path ctx = new Path(); ctx.moveTo(Ax,Ay); //A ctx.lineTo(Bx,By);//B ctx.arcTo(new RectF(Bx, By, Cx, Cy), 270, 90); //BC arc ctx.lineTo(Dx,Dy); //D ctx.arcTo(new RectF(Dx - arc, Dy, Ex + arc, Ey),0,90); //DE arc ctx.lineTo(Fx, Fy); //EF ctx.lineTo(Gx, Gy); //FG ctx.lineTo(Hx, Hy); //GH ctx.lineTo(Ix, Iy); //H - I ctx.arcTo(new RectF(Jx, Jy, Ix, Iy),90,90);// I = J arc ctx.lineTo(Kx, Ky); //K ctx.arcTo(new RectF(Ax - arc, Ay, Kx + arc, Ky),180,90); //K - A arc ctx.lineTo(Ax, Ay); //K Paint p = new Paint(); p.setAntiAlias(true); p.setColor(0xffffffff); p.setStyle(Style.FILL); canvas.drawPath(ctx, p); p.setColor(0xff000000); p.setStyle(Style.STROKE); p.setStrokeWidth(3); canvas.drawPath(ctx, p); } 

感谢这个例子,它使参数非常清晰的理解。 从我在Android的开发文档中读到的,你可能会省去一些“lineTo()”调用(除了点F,G,H),因为arcTo的第一个点是arcTo会自动添加一个lineTo不是最后一点画的…

至于为什么0开始东,这是因为math和三angular学的经验教训通常假设0度标记是三angular圆(中心为0,0和半径1的圆)与X轴相交的点,即东(这些同样的经验教训一般都是逆时针方向,所以90度就是北,270是南,而在Android上看起来angular度是顺时针的)

下面是一些示例代码(从我的一个类拼凑在一起)绘制一个填充的圆angular矩形,然后添加一个描边的矩形给它一个边框:

 //Initializing some stuff _paint = new Paint(); _rect = new RectF(); _radius = 10; _bgColor = 0xFFFFFFFF; _borderColor = 0xFFCCCCCC; //Doing dimension calculations _rect.left = 0; _rect.top = 0; _rect.right = this.getWidth() - 1; _rect.bottom = this.getHeight() - 1; //painting //draw the background _paint.setColor(_bgColor); _paint.setStyle(Style.FILL_AND_STROKE); canvas.drawRoundRect(_rect, _radius, _radius, _paint); //draw the border _paint.setStrokeWidth(1); _paint.setColor(_borderColor); _paint.setStyle(Style.STROKE); canvas.drawRoundRect(_rect, _radius, _radius, _paint);