flash绘图API flash player11新增的绘图API方法--cubicCurveTo

               

  今天除了更新的3D的api之前,另外在flash Graphics方法当中新增了一个cubicCurveTo的方法,能够使用其进行绘制贝塞尔曲线,奇怪是文档里面对应的flash 版本是12,不知道是不是写错了,呵呵。基本上用法很简单。和curveTo差不多,只是多了一个控制点。

提前使用这个api 运行时候,只能在安装最新flash player 11插件的浏览器运行。目前还没正式发布相应flash player11播放器正式版本。等待五月份官方会推出正式版,所以还需要耐心等待。另外一些非官方的播放器可以debug的时候使用脱离浏览器测试,要是等不及的可以下载来试试。

 

 

使用编译后的程序需要使用最新版本先可以看到效果。

可以在这里下载对应的flash player 11的版本:目前只是支持插件的形式。

http://labs.adobe.com/technologies/flashplatformruntimes/incubator/

 

新增的api方法,依旧在Graphics类找到,这次绘制贝塞尔曲线有利于制作绘图的时候,一些在线的ps工具可以利用这个函数进行设计贝塞尔的三次的运算,而不用使用其他运算公式模拟三次的效果。

 

public function cubicCurveTo(controlX1:Number, controlY1:Number, controlX2:Number, controlY2:Number, anchorX:Number, anchorY:Number):void

 

Language Version: ActionScript 3.0

 

Runtime Versions: AIR 1.0, Flash Player 12

 

 

测试代码:

import flash.display.Sprite;for (var i:int=0; i<4; i++){ var shape:Sprite=new Sprite(); addChild(shape); shape.x = 300; shape.y = 300; shape.graphics.lineStyle(0); shape.graphics.beginFill(Math.random()*0xffffff); shape.graphics.cubicCurveTo(-290,-280,290,-280,0,0); shape.graphics.endFill(); shape.rotation = i * 90;}

测试的效果如下:

 

 

 

使用的时候,恰当改一下复制10次数可以变化上面的效果;

import flash.display.Sprite;for (var i:int=0; i<10; i++){ var shape:Sprite=new Sprite(); addChild(shape); shape.x = 300; shape.y = 300; shape.graphics.lineStyle(0); shape.graphics.beginFill(Math.random()*0xffffff); shape.graphics.cubicCurveTo(-290,-280,290,-280,0,0); shape.graphics.endFill(); shape.rotation = i * 36;}

 

import flash.display.Sprite;for (var i:int=0; i<360; i++){ var shape:Sprite=new Sprite(); addChild(shape); shape.x = 300; shape.y = 300; shape.graphics.lineStyle(0); shape.graphics.beginFill(Math.random()*0xffffff); shape.graphics.cubicCurveTo(-5,-280,5,-280,0,0); shape.graphics.endFill(); shape.rotation = i;}

 

 

除此之外,改变参数和复制次数会产生很多图片变化,这跟之前所制作的玫瑰线和旋轮线制作原理是一样的。

 

 

把之前的程序修改一下,可以进行多点控制。

 

package { //贝塞尔曲线 import flash.display.Sprite; import flash.events.*; import flash.geom.*; public class Main extends Sprite {  private var pen:Sprite=new Sprite();  private var circleA:CirclePoint;  private var circleB:CirclePoint;  private var circleC:CirclePoint;  private var circleD:CirclePoint;  public function Main()  {   init();  }    //初始化  private function init():void  {   drawGrid(20,30,16,16);//绘制网格   addChild(pen);   pen.graphics.lineStyle(1,0xff0000);   pen.graphics.moveTo(20,160);   pen.graphics.cubicCurveTo(130,290,270,50,460,160);   circleA=new CirclePoint();   circleA.addEventListener(MouseEvent.MOUSE_DOWN,circle_DragHandler);   addChild(circleA);   circleA.x=20;   circleA.y=160;   circleB=circleA.clone();   circleB.addEventListener(MouseEvent.MOUSE_DOWN,circle_DragHandler);   addChild(circleB);   circleB.x=130;   circleB.y=290;   circleC=circleA.clone();   circleC.addEventListener(MouseEvent.MOUSE_DOWN,circle_DragHandler);   addChild(circleC);   circleC.x=270;   circleC.y=50;      circleD=circleA.clone();   circleD.addEventListener(MouseEvent.MOUSE_DOWN,circle_DragHandler);   addChild(circleD);   circleD.x=460;   circleD.y=160;         pen.graphics.moveTo(circleA.x,circleA.y);   pen.graphics.lineTo(circleB.x,circleB.y);            pen.graphics.lineTo(circleC.x,circleC.y);   pen.graphics.lineTo(circleD.x,circleD.y);      stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUpHandler);  }     private function circle_DragHandler(event:MouseEvent):void  {   stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMoveHandler);   event.currentTarget.startDrag(false,new Rectangle(10,10,460,300));//控制拖动区间  }  private function onMouseMoveHandler(event:MouseEvent):void  {   redraw();  }  private function onMouseUpHandler(event:MouseEvent):void  {   stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMoveHandler);   circleA.stopDrag();   circleB.stopDrag();  }    //重绘  private function redraw():void  {   pen.graphics.clear();   pen.graphics.lineStyle(1,0xff0000);   pen.graphics.moveTo(circleA.x,circleA.y);            pen.graphics.cubicCurveTo(circleB.x,circleB.y,circleC.x,circleC.y,circleD.x,circleD.y);            pen.graphics.moveTo(circleA.x,circleA.y);            pen.graphics.lineTo(circleB.x,circleB.y);            pen.graphics.lineTo(circleC.x,circleC.y);   pen.graphics.lineTo(circleD.x,circleD.y);     }  //绘制网格  private function drawGrid(rows :int,cols:int,titleW:int,titleH:int):void  {          this.graphics.lineStyle(1,0xffffff,0.2);    for (var i:int=0; i<rows; i++)   {    for (var j:int=0; j<cols ; j++)    {           this.graphics.drawRect(j*titleW,i*titleH,titleW,titleH);//绘制矩形    }   }  }   }}//创建点类import flash.display.Sprite;internal class CirclePoint extends Sprite{ public function CirclePoint(R:int=8) {  this.graphics.lineStyle(0);  this.graphics.beginFill(0xffffff);  this.graphics.drawCircle(0,0,R);  this.graphics.endFill(); } public function clone():CirclePoint {  return new CirclePoint(); } public function move(x:Number,y:Number):void {  this.x=x;  this.y=y; }}

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 心形图案在编程中其实是比较经典的案例,涉及基本的图形绘制与计算。此处提供一个简单的示例代码,使用Java的AWT图形库进行绘制: ``` import java.awt.*; public class HeartShape extends Frame { public void paint(Graphics g) { int[] xs = {100, 140, 170, 140, 100, 60, 30, 60}; int[] ys = {100, 70, 100, 130, 160, 130, 100, 70}; g.setColor(Color.red); g.fillPolygon(xs, ys, xs.length); } public static void main(String[] args) { HeartShape app = new HeartShape(); app.setSize(200, 200); app.setVisible(true); } } ``` 代码中,我们先定义了心形的点集合,分别存储在xs和ys两个数组中。然后,我们使用setColor来设置颜色,并使用fillPolygon方法进行填充。最后,在main中启动应用,设置窗口大小并在屏幕上展示。运行代码后即可看到屏幕上出现了一个简单的红色心形。 ### 回答2: 用Java代码制作一个心形图形可以使用字符组成。以下是一个简单示例: ```java public class DrawHeart { public static void main(String[] args) { // 定义心形的大小 int size = 10; // 绘制上半部分 for (int i = size / 2; i <= size; i += 2) { // 绘制空格 for (int j = 1; j < size - i; j += 2) { System.out.print(" "); } // 绘制左半部分 for (int j = 1; j <= i; j++) { System.out.print("*"); } // 绘制空格 for (int j = 1; j <= size - i; j++) { System.out.print(" "); } // 绘制右半部分 for (int j = 1; j <= i; j++) { System.out.print("*"); } System.out.println(); } // 绘制下半部分 for (int i = size; i >= 1; i--) { // 绘制空格 for (int j = size; j > i; j--) { System.out.print(" "); } // 绘制左半部分 for (int j = 1; j < 2 * i; j++) { System.out.print("*"); } System.out.println(); } } } ``` 这个程序使用循环和条件语句来绘制心形图案。首先定义了心形的大小,然后通过两个循环分别绘制上半部分和下半部分。每一行使用空格和星号字符来构建。输出结果将是一个简单的心形图案。 ### 回答3: 要用Java代码绘制一个心形图案,可以使用Java的图形库,如JavaFX或AWT。以下是一个示例代码: ``` java import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Arc; import javafx.scene.shape.CubicCurveTo; import javafx.scene.shape.MoveTo; import javafx.scene.shape.Path; import javafx.scene.transform.Rotate; import javafx.stage.Stage; public class HeartShape extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 300); double centerX = scene.getWidth() / 2; double centerY = scene.getHeight() / 2; Path path = new Path(); MoveTo moveTo = new MoveTo(centerX, centerY + 70); CubicCurveTo cubicCurveTo1 = new CubicCurveTo(centerX + 50, centerY - 30, centerX + 90, centerY + 40, centerX, centerY + 120); CubicCurveTo cubicCurveTo2 = new CubicCurveTo(centerX - 90, centerY + 40, centerX - 50, centerY - 30, centerX, centerY + 70); path.getElements().add(moveTo); path.getElements().addAll(cubicCurveTo1, cubicCurveTo2); // 绘制填充颜色为红色的心形 path.setFill(Color.RED); // 设置旋转角度使心形翻转 path.getTransforms().add(new Rotate(180, centerX, centerY)); root.getChildren().add(path); primaryStage.setScene(scene); primaryStage.show(); } } ``` 上述代码使用JavaFX库来绘制心形图案。首先,我们创建了一个`Path`对象,然后通过添加`MoveTo`和`CubicCurveTo`来定义心形的曲线轨迹。最后,我们设置填充颜色为红色,还添加了旋转变换使心形翻转。最后,我们将绘制好的心形添加到场景图中,并显示在舞台上。运行这段代码,就可以看到一个用Java代码绘制的心形图案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值