zoukankan      html  css  js  c++  java
  • 一个细致的立方贝泽尔曲线的例子

    前几天,O'Reilly出版社发表了一本免费的在线书籍,是“What's New in Flash Player 11”,里面有一个关于立方贝泽尔曲线的小Demo,但是太过简单。那个Demo的源码是这样的:

    package {
      import flash.display.Sprite;
      
      [SWF(width="600", height="500", backgroundColor="#CCCCCC")]
      
      public class CubicBezierCurve extends Sprite {
        
        private var drawingHolder:Sprite;
        
        public function CubicBezierCurve() {
          generateDisplayObjects();
        }
        
        protected function generateDisplayObjects():void {
          drawingHolder = new Sprite();
          drawingHolder.graphics.moveTo(20, stage.stageHeight-20);
          drawingHolder.graphics.lineStyle(5,0x000000);
          drawingHolder.graphics.cubicCurveTo(50, 50, stage.stageWidth-50, 50, stage.stageWidth-20, stage.stageHeight-20);
          addChild(drawingHolder);
        }
        
      }
    }


    但是我感觉这个示例有点太简单了,另外也有在微博上问我,以前在Developer活动上,有另外一个Cubic Bezier的示例,比上面这个要好很多。那我就把我那个示例也贴在这里供参考。

    package
    {
      import flash.display.Sprite;
      import flash.events.MouseEvent;
      import flash.system.System;

            [SWF(width="600", height="500", backgroundColor="#CCCCCC")]

      public class Incubator_CubicBezierCurves extends Sprite
      {
        private var controlPoint1:Sprite;
        private var controlPoint2:Sprite;
        private var anchorPoint0:Sprite;
        private var anchorPoint1:Sprite
        public function Incubator_CubicBezierCurves()
        {
          super();
          anchorPoint0 = addPoint(50,300);
          anchorPoint1 = addPoint(500,300);
          controlPoint1 = addPoint(125,100);
          controlPoint2 = addPoint(400,100);
          drawCubicCurve();
        }
        private function addPoint(x:Number,y:Number):Sprite{
          var point:Sprite = new Sprite();
          // 用很短长度的粗线绘制一个圆点
          point.graphics.lineStyle(10,0xFF0000);
          point.graphics.lineTo(1,0);
          point.addEventListener(MouseEvent.MOUSE_DOWN, onControlDown);
          point.addEventListener(MouseEvent.MOUSE_UP, onControlUp);
          point.x = x;
          point.y = y;
          addChild(point);
          return point;
        }
        
        private function onControlDown(event:MouseEvent):void{
          (event.target as Sprite).startDrag();
          stage.addEventListener(MouseEvent.MOUSE_MOVE, onControlMove);
        }
        
        private function onControlUp(event:MouseEvent):void{
          (event.target as Sprite).stopDrag();
          stage.removeEventListener(MouseEvent.MOUSE_MOVE, onControlMove);
        }
        
        private function onControlMove(event:MouseEvent):void{
          drawCubicCurve();
          event.updateAfterEvent();
        }
        
        private function drawCubicCurve():void{
          graphics.clear();
          graphics.lineStyle(3, 0xFF);
          trace(anchorPoint0.x);
          trace(anchorPoint0.y);
          graphics.moveTo(anchorPoint0.x, anchorPoint0.y);
          graphics.cubicCurveTo(controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y,anchorPoint1.x,anchorPoint1.y);
          graphics.lineStyle(1, 0, .5);
          graphics.lineTo(controlPoint2.x, controlPoint2.y);
          graphics.lineTo(controlPoint1.x, controlPoint1.y);
          graphics.lineTo(anchorPoint0.x,anchorPoint0.y);
        }
        
      }
    }


    第二个示例提供了针对立方贝泽尔曲线在绘制时的四个点(起始点,拐点1,拐点2,终点)的随意控制,有助于更好的理解立方贝泽尔曲线的优势之处。

  • 相关阅读:
    mormot2封装tcp
    mormot.net.client.pas
    mormot.net.server.pas
    delphi working with big data databases in Cassandra, Couchbase and MongoDB
    Grijjy.ProtocolBuffers.pas
    Grijjy.Bson.Serialization.pas
    GrijjyFoundation开源框架
    Unidac内存表使用
    传统关系型数据库正在完成华丽的蜕变
    使用arthas 分析java 应用的一个流程总结
  • 原文地址:https://www.cnblogs.com/shihao/p/2452943.html
Copyright © 2011-2022 走看看