トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     円の方程式を利用して円を描画する方法
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
keiko1987
Åê¹ÆNo.35757
投稿日時: 2007-10-19 21:45
新米
居住地:
投稿: 3
使用環境:
win xp sp2,flash cs3 pro
円の方程式を利用して円を描画する方法
質問させていただきます flash cs3 proを利用し、action script3.0を独学をしています

円の方程式を利用し、Graphics.lineTo()を使い円を描画しようと
考え以下のコードを書きました(汚いコードですみません(汗)

package {

	import flash.display.*;
	import flash.events.Event;

	public class DrawTest {
		var canvas:Sprite;
		var tmpmc:MovieClip;
		var tmpno:Number=0;
		var oldtx:Number;
		var oldty:Number;
		var color:uint=0x666666;

		//
		public function DrawTest(targetmc:MovieClip) {
			tmpmc=targetmc;
			tmpmc.addEventListener(Event.ENTER_FRAME,enterFrameCaller);
		}
		public function enterFrameCaller(event:Event) {
			tmpno++;
			tx=tmpno;
			var tx:Number;
			var ty:Number;
			var r:Number=50;
			
			ty=(Math.sqrt(Math.abs(r*r)-((tx-50)*(tx-50))));

			canvas=new Sprite();
			//
			var alpha:Number=1.0;
			var thickness:uint=1;
			//
			var container:DisplayObjectContainer=tmpmc.root as DisplayObjectContainer;
			canvas.graphics.lineStyle(thickness,color,alpha);
			if (isNaN(oldtx)) {
				canvas.graphics.moveTo(tx,ty);
			} else {
				canvas.graphics.moveTo(oldtx,oldty);
			}
			canvas.graphics.lineTo(tx,ty);
			container.addChild(canvas);
			oldtx=tx;
			oldty=ty;

			if (tmpno>300) {
				tmpmc.removeEventListener(Event.ENTER_FRAME,enterFrameCaller);
			}
		}
	}
}


円の方程式

(x-h)^2+(y-k)^2=r^2から
ty=(Math.sqrt(Math.abs(r*r)-((tx-50)*(tx-50))))
という式を書いたのですが、
半円を描画した時点でどうもおかしな事になってしまいます

どなたか原因がおわかりになられる方、ご教授いただけたらと
思います

よろしくお願いします
野中文雄
Åê¹ÆNo.35760
投稿日時: 2007-10-19 22:35
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 円の方程式を利用して円を描画する方法
「おかしな事」では、ご説明になっていません。→【第三者から見てわからない

ただ、ひとつの変数xに対して、yの解はふたつあるはずです。
y = ±√(r^2-(x-h)^2)
引用:
keiko1987さんは書きました:
円の方程式

(x-h)^2+(y-k)^2=r^2から
ty=(Math.sqrt(Math.abs(r*r)-((tx-50)*(tx-50))))
という式を書いたのですが、
半円を描画した時点でどうもおかしな事になってしまいます

あいにくスクリプトを解析している時間の余裕がありません。→【スクリプトを見てください

上記の2根に関わると考えられる部分のみ、修正・追加してみました。意図に合わない点は、改めて具体的にご質問ください。
package {

	import flash.display.*;
	import flash.events.Event;

	public class DrawTest {
		var canvas:Sprite;
		var tmpmc:MovieClip;
		var tmpno:Number=0;
		var oldtx:Number;
		var oldty:Number;
		var color:uint=0x666666;

		//
		public function DrawTest(targetmc:MovieClip) {
			tmpmc=targetmc;
			tmpmc.addEventListener(Event.ENTER_FRAME,enterFrameCaller);
		}
		public function enterFrameCaller(event:Event) {
			tmpno++;
			tx=tmpno;
			var tx:Number;
			var ty:Number;
			var r:Number=50;

			ty=(Math.sqrt(Math.abs(r*r)-((tx-50)*(tx-50))));

			canvas=new Sprite();
			//
			var alpha:Number=1.0;
			var thickness:uint=1;
			//
			var container:DisplayObjectContainer=tmpmc.root as DisplayObjectContainer;
			canvas.graphics.lineStyle(thickness,color,alpha);

			var nX:Number;
			var nY:Number;
			if (isNaN(oldtx)) {
				// canvas.graphics.moveTo(tx,ty);
				nX = tx;
				nY = ty;
			} else {
				// canvas.graphics.moveTo(oldtx,oldty);
				nX = oldtx;
				nY = oldty;
			}
			canvas.graphics.moveTo(nX,nY);
			canvas.graphics.lineTo(tx,ty);
			canvas.graphics.moveTo(nX,-nY);
			canvas.graphics.lineTo(tx,-ty);
			container.addChild(canvas);
			oldtx=tx;
			oldty=ty;

			// if (tmpno>300) {
			if (tmpno>r*2) {
				tmpmc.removeEventListener(Event.ENTER_FRAME,enterFrameCaller);
			}
		}
	}
}

もっとも、円を描くには、三角関数を使う方が簡単に思えます。
	x = r・cosθ+Cx
	y = r・sinθ+Cy

参考:Macromedia Flash TechNote「 角度と座標の計算 ? Flash の三角関数を使う
描画メソッドで円を描く


----------------
 

永井勝則
Åê¹ÆNo.35769
投稿日時: 2007-10-21 14:21
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: 円の方程式を利用して円を描画する方法
以下は三角関数を使った円を描くコードなので、質問とは直接関係ないですが、
(ほんの少しだけ)興味があったので野中さんが引用されたリンク先の公式のActionScriptコードを見ながら、
AS1、AS2、AS3で三角関数を使って、ステージに円を描くコードを書いてみました。
//AS 1.0
//メインのタイムラインに置いたムービークリップに適用するMovieClipアクション
onClipEvent (load) {
	this._visible=false
	var root=this._parent
	root.lineStyle(2,0x0000FF);
	var nTheat = 0;
	var radius = 40;
	var segment = 0.2;
	var centerX = Stage.width/2;
	var centerY = Stage.height/2;
	var xpos = radius*Math.cos(nTheat)+centerX;
	var ypos = radius*Math.sin(nTheat)+centerY;
	root.moveTo(xpos,ypos);
	
}
onClipEvent (enterFrame) {
	nTheat += segment;
	xpos = radius*Math.cos(nTheat)+centerX;
	ypos = radius*Math.sin(nTheat)+centerY;
	root.lineTo(xpos,ypos);
	//this._x = xpos;
	//this._y = ypos;
}


//AS 2.0
//メインのタイムラインのフレーム
var root:MovieClip=_root
var nTheat:Number = 0;
var radius:Number = 40;
var segment:Number = 0.2;
var centerX:Number = Stage.width/2;
var centerY:Number = Stage.height/2;
var xpos:Number = radius*Math.cos(nTheat)+centerX;
var ypos:Number = radius*Math.sin(nTheat)+centerY;
root.lineStyle(2,0x0000FF);
root.moveTo(xpos,ypos);

root.onEnterFrame = function() {
	nTheat += segment;
	xpos = radius*Math.cos(nTheat)+centerX;
	ypos = radius*Math.sin(nTheat)+centerY;
	this.lineTo(xpos,ypos);
};


//AS 3.0
//DrawCircleクラス DrawCircle.as
//DrawCircle.flaでドキュメントクラスに指定する
package {

	import flash.display.Sprite;
	import flash.events.Event;

	public class DrawCircle extends Sprite {
		private var nTheat:Number;
		private var xpos:Number;
		private var ypos:Number;
		private var radius:Number;
		private var centerX:Number;
		private var centerY:Number;
		private var segment:Number;

		public function DrawCircle() {
			init();
		}
		
		private function init():void {
			nTheat=0;
			radius=40;
			segment=0.2;
			centerX=stage.stageWidth/2;
			centerY=stage.stageHeight/2;
			xpos=radius * Math.cos(nTheat) +centerX;
			ypos=radius * Math.sin(nTheat) + centerY;
			graphics.lineStyle(2,0x0000FF);
			graphics.moveTo(xpos,ypos);
			addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
		}
		
		private function onEnterFrameHandler(event:Event):void {
			nTheat+= segment;
			xpos=radius * Math.cos(nTheat) + centerX;
			ypos=radius * Math.sin(nTheat) + centerY;
			graphics.lineTo(xpos,ypos);
		}
	}
}

これを見ると、ASの各バージョンでやっていることは同じであり、またAS3.0では記述するコードの量が(むやみに)増えていることが分かります。


----------------
永井勝則:
himco.jp :

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops