ActionScript - 不准确的图形?

时间:2010-11-03 13:57:41

标签: flash actionscript-3 graphics stroke

我试图在圆角矩形周围画一个红色笔划(1个厚度)但是笔划没有正确地围绕圆角排列。

我的圆角矩形的圆角有一个椭圆宽度和38的椭圆高度,因为它们是相等的,我有信心假设每个角的曲率都从角落大小的一半开始。因此,不是将我的笔划一直画到角落,而是在角落之前以20像素结束笔划,并在角落之后将其弯曲到20像素。清楚如泥?

有趣的是,如果我按照相同的代码在圆角矩形周围绘制笔划,则只会在这两个角落周围绘制不准确的笔划。此外,如果笔划增加到2,则不再可见间隙。

//Rounded Rectangle
var rectWidth:uint = 300;
var rectHeight:uint = 100;
var rectCorners:uint = 40;

var rect:Shape = new Shape();
rect.graphics.beginFill(0);
rect.graphics.drawRoundRect(-rectWidth / 2, -rectHeight / 2, rectWidth, rectHeight, rectCorners, rectCorners);

//Stroke
var stroke:Shape = new Shape();
stroke.graphics.lineStyle(1, 0xFF0000, 1, true, "normal", "none", "miter", 3);

//Stroke Around Top Right Corner
stroke.graphics.moveTo(rect.x + rectWidth / 2 - rectCorners / 2, rect.y - rectHeight / 2);
stroke.graphics.curveTo(rect.x + rectWidth / 2, rect.y - rectHeight / 2, rect.x + rectWidth / 2, rect.y - rectHeight / 2 + rectCorners / 2);

//Stroke Around Bottom Right Corner  
stroke.graphics.lineTo(rect.x + rectWidth / 2, rect.y + rectHeight / 2 - rectCorners / 2);
stroke.graphics.curveTo(rect.x + rectWidth / 2, rect.y + rectHeight / 2, rect.x + rectWidth / 2 - rectCorners / 2, rect.y + rectHeight / 2);

//Add To Display List
addChild(rect);
addChild(stroke);

alt text


更新

圆形矩形和角形越大,我的中风变得越大。我不再相信我的curveTo()函数的曲率/锚点是正确的。有什么想法吗? alt text

1 个答案:

答案 0 :(得分:1)

为什么不使用drawRoundRect绘制笔划?或者使用弯曲填充?或者设置笔划,设置填充和THEN drawRoundRect?


好的,然后查看此代码:

        var rectWidth:Number = 300;
        var rectHeight:Number = 100;
        var rectCorners:Number = 40;

        var rectWidthS:Number = 300 - 1;
        var rectHeightS:Number = 100 - 1;
        var rectCornersS:Number = 40 - 1;

        var rect:Shape = new Shape();
        rect.graphics.beginFill(0);
        rect.graphics.drawRoundRect(0, 0, rectWidth, rectHeight, rectCorners, rectCorners);

        //Stroke
        var stroke:Shape = new Shape();
        stroke.graphics.lineStyle(1, 0xFF0000, 1, true, "normal", "none", "miter", 3);

        //Stroke Around Top Right Corner
        stroke.graphics.moveTo (rectWidthS - rectCornersS / 2, 0);
        stroke.graphics.curveTo(rectWidthS,                   0, rectWidthS, rectCornersS / 2);

        //Stroke Around Bottom Right Corner  
        stroke.graphics.lineTo (rectWidthS,                   rectHeightS - rectCornersS / 2);
        stroke.graphics.curveTo(rectWidthS, rectHeightS, rectWidthS - rectCornersS / 2, rectHeightS);

这是计算宽度和高度的有趣方式的问题。每当你想在某个形状的最后一个像素上放置一些东西时,你必须把它放在一个位置x +宽度 - 1!我不确定它是否完美,但是从我能看到的它确实看起来很有希望。


我保持rectWidthSrectHeightS值不变,但在修改为rectCornersS = 40后,它似乎完美无缺。看看http://img137.imageshack.us/img137/7779/58480490.png。或者我没有看到什么。我理解它仍然可能无法与更复杂的形状完美配合,但它应该是可行的足够的工作。