немного странный вопрос о графике в flex - PullRequest
1 голос
/ 24 февраля 2011

Допустим, у вас есть общий объект Graphics с заливкой и штрихом. Есть ли простой способ нарезать этот объект, например, по вертикали, и получить объект Graphics, который представляет его подмножество?

Другими словами, как будет выглядеть срез функции ниже?

var gOriginal:Graphics;
var gNew:Graphics;
gNew = slice(gOriginal, "vertical", "0.5);

так, чтобы, если gOriginal был эллипсом, я теперь получал половину эллипса?

спасибо

F

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

Я в основном придерживаюсь концепции Даниэля (за исключением того, что у меня есть некоторые глубоко укоренившиеся, необъяснимые, презрение к деграфе), вы должны быть в состоянии сделать это:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="955"
               minHeight="600"
               creationComplete="application1_creationCompleteHandler(event)">
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;
            import mx.events.FlexEvent;

            import spark.components.Group;

            public var someGraphics:UIComponent;
            [Bindable]
            public var bd:BitmapData;
            [Bindable]
            public var finalBD:BitmapData;
            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
            {
                super.updateDisplayList(unscaledWidth,unscaledHeight);
                if(someGraphics)
                {
                    someGraphics.graphics.beginFill(0xFF0000);
                    someGraphics.graphics.drawEllipse(0,0,100,20);
                    someGraphics.graphics.endFill();

                    bd.draw(someGraphics);
                    finalBD.copyPixels(bd,new Rectangle(0,0,bd.width*.5,bd.height),new Point());
                }
            }

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                someGraphics = new UIComponent();
                bd = new BitmapData(100,100);
                finalBD = new BitmapData(100,100);
                invalidateDisplayList();
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:BitmapImage source="{bd}" width="100" height="100"/>
    <s:BitmapImage source="{finalBD}" width="100" height="100"/>
</s:Application>

Это, очевидно, далеко от довольнорешение, но просто сделать графику в некотором объекте, который имеет графическое свойство, затем использовать метод рисования BitmapData, чтобы получить пиксели в растровые данные, а затем скопировать часть этих пикселей в другое BitmapData для отображения, это, вероятно, больше памяти, но меньшеПроцессор интенсивнее, чем у Джереми.Кроме того, я использую UIComponent, требование к методу draw заключается в том, чтобы класс реализовывал IBitmapDrawable, поэтому, какова бы ни была самая легкая реализация из этого, вероятно, вы хотите использовать, UIComponent является предположением.

1 голос
/ 24 февраля 2011

Нет встроенного метода для удаления частей объекта Graphics.Скорее всего, вам нужно будет обрабатывать каждый тип фигуры (прямоугольник, эллипс, многоугольник) по-разному в отношении его «разрезания».Например, чтобы нарезать эллипс, аналогично извлечению среза из круговой диаграммы, вам необходимо нарисовать фигуры с помощью небольшого трига для создания клина.

Вот основная функция для рисования клиньев:

protected function drawWedge():void 
{
    var g:Graphics = shape.graphics;    
    g.clear();
    g.lineStyle( 1, 0xFFFFFF );
    g.beginFill( 0xCCCCCC );

    var radiusX:Number = 100;
    var radiusY:Number = 100;
    var angle:Number = 0;
    var xpos:Number = 0;
    var ypos:Number = 0;
    var segments:Number = 25;
    var degrees:Number = 45;
    var inc:Number = degrees / ( segments );

        for( var i:int = 0; i <= segments; i++ )
        {
            xpos =  Math.cos( Math.PI * angle / 180 ) * radiusX;
            ypos =   Math.sin( Math.PI * angle / 180 ) * radiusY;

            g.lineTo( xpos, ypos );

            angle += inc;
        }

        g.endFill();
}

Настройка переменных angleX и angleY при их инициализации начнёт рисовать клин в другой точке по окружности.Если вы измените degrees на 360, вы увидите полный круг, а на 180 вы получите полукруг.Измените radiusX и radiusY, чтобы создать овал.Также segments контролирует разрешение чертежа.Увеличьте его, и вы получите более плавный изгиб.

Надеюсь, это поможет.

1 голос
/ 24 февраля 2011

Вы можете нарисовать () его в растровом объекте и выбрать прямоугольник для включения, который может иметь тот же эффект, но не существует простого способа сделать это.

Вы также можете посмотреть на деграфа , но это может стать слишком сложным

...