سؤال

أحاول رسم ضربة حمراء (سمك واحد) حول مستطيل مستدير ولكن السكتة الدماغية لا تصطف بشكل صحيح حول الزوايا المستديرة.

تحتوي زوايا المستطيل المستدير على عهد القطع الناقض والقطع الناقص من 40 عامًا. نظرًا لأنها متساوية ، فأنا واثق من افتراض أن انحناء كل زاوية يبدأ عند نصف حجم الزاوية. لذا ، بدلاً من سحب السكتة الدماغية على طول الطريق إلى الزاوية ، سأنهي السكتة الدماغية عند 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

هل كانت مفيدة؟

المحلول

لماذا لا تستخدم 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! لست متأكدًا مما إذا كان ذلك مثاليًا ، ولكن من ما يمكنني رؤيته يبدو واعداً.


أغادر rectWidthS و rectHeightS القيم التي لم تمسها ، ولكن بعد التعديل ل rectCornersS = 40, ، يبدو أنه يعمل بشكل مثالي. إلق نظرة http://img137.imageshack.us/img137/7779/58480490.png. أو فشل في رؤية شيء ما. على الرغم من أنه لا يزال لا يزال يعمل بشكل مثالي بأشكال أكثر تعقيدًا ، ولكن يجب أن يكون ممكنًا مع ما يكفي من العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top