前回の第16回
透視投影のメソッドをオブジェクトに定める
オブジェクトをクラスからつくると、
// 3次元座標のオブジェクトをつくる
var point3D = new Point3D(x座標, y座標, z座標);
// 3次元座標を2次元座標に透視投影
var point2D = point3D.getProjetedPoint(焦点距離);
もっとも、
function rotate(eventObject) {
var count = points.length;
points2D.length = 0;
matrix.identity().rotate(angle);
for (var i = 0; i < count; i++) {
var point = points[i];
matrix.transformPoint(point.x, point.z, _point);
point.x = _point.x;
point.z = _point.y;
// points2D[i] = getProjetedPoint(focalLength, point);
points2D[i] = point.getProjetedPoint(focalLength);
}
draw(points2D);
つぎに手を加えるのは、
function newPoint3D(x, y, z) {
var point3D = {x:x, y:y, z:z};
point3D.getProjetedPoint = getProjetedPoint; // 関数をメソッドとして定める
return point3D;
}
そして、
// function getProjetedPoint(focalLength, _point3D) {
function getProjetedPoint(focalLength) {
var point2D = new createjs.Point();
// var w = focalLength / (focalLength + _point3D.z);
var w = focalLength / (focalLength + this.z);
// point2D.x = _point3D.x * w;
point2D.x = this.x * w;
// point2D.y = _point3D.y * w;
point2D.y = this.y * w;
return point2D;
}
これで、
![図1 星形の3次元座標がy軸で水平に回って透視投影される 図1 星形の3次元座標がy軸で水平に回って透視投影される](/assets/images/design/serial/01/createjs/0017/thumb/TH235_00101.png)
![図1 星形の3次元座標がy軸で水平に回って透視投影される 図1 星形の3次元座標がy軸で水平に回って透視投影される](/assets/images/design/serial/01/createjs/0017/thumb/TH235_00102.png)
var stage;
var drawGraphics;
var points;
var angle = Math.PI / 36;
var matrix = new createjs.Matrix2D();
var stageCenterX;
var _point = new createjs.Point();
var points2D = [];
var focalLength = 300;
function initialize() {
var canvasElement = document.getElementById("myCanvas");
stage = new createjs.Stage(canvasElement);
stageCenterX = canvasElement.width / 2;
drawGraphics = createGraphics(stageCenterX, canvasElement.height / 2);
points = createStarPoints(5, 65, 25);
draw(points);
createjs.Ticker.addEventListener("tick", rotate);
stage.addEventListener("stagemousemove", setAngle);
}
function setAngle(eventObject) {
var mouseX = eventObject.stageX;
angle = (mouseX - stageCenterX) * 1 / 300;
}
function rotate(eventObject) {
var count = points.length;
points2D.length = 0;
matrix.identity().rotate(angle);
for (var i = 0; i < count; i++) {
var point = points[i];
matrix.transformPoint(point.x, point.z, _point);
point.x = _point.x;
point.z = _point.y;
points2D[i] = point.getProjetedPoint(focalLength);
}
draw(points2D);
}
function createGraphics(x, y) {
var drawShape = new createjs.Shape();
drawShape.x = x;
drawShape.y = y;
stage.addChild(drawShape);
return drawShape.graphics;
}
function draw(points) {
var count = points.length;
var point = points[count - 1];
drawGraphics.clear()
.beginStroke("mediumblue")
.setStrokeStyle(3)
.moveTo(point.x, point.y);
for (var i = 0; i < count; i++) {
point = points[i];
drawGraphics.lineTo(point.x, point.y);
}
stage.update();
}
function createStarPoints(numVertices, longRadius, shortRadius) {
var starPoints = [];
var angle = Math.PI;
var theta = angle / numVertices;
angle /= -2;
for (var i = 0; i < numVertices; i++) {
starPoints.push(newPoint3D(longRadius * Math.cos(angle), longRadius * Math.sin(angle), 0));
angle += theta;
starPoints.push(newPoint3D(shortRadius * Math.cos(angle), shortRadius * Math.sin(angle), 0));
angle += theta;
}
return starPoints;
}
function newPoint3D(x, y, z) {
var point3D = {x:x, y:y, z:z};
point3D.getProjetedPoint = getProjetedPoint;
return point3D;
}
function getProjetedPoint(focalLength) {
var point2D = new createjs.Point();
var w = focalLength / (focalLength + this.z);
point2D.x = this.x * w;
point2D.y = this.y * w;
return point2D;
}
コンストラクタ関数を定める
つぎは、
// コンストラクタ関数の定義
function クラス名() {}
// new演算子で呼出す
var 変数 = new クラス名();
コンストラクタ関数には値を返すreturnステートメントは書かない。new演算子で呼び出せば、
すると、
// function newPoint3D(x, y, z) {
function Point3D(x, y, z) {
/*
var point3D = {x:x, y:y, z:z};
point3D.getProjetedPoint = getProjetedPoint;
return point3D;
*/
this.x = x;
this.y = y;
this.z = z;
this.getProjetedPoint = getProjetedPoint;
}
3次元座標をつくって配列に納める関数
function createStarPoints(numVertices, longRadius, shortRadius) {
var starPoints = [];
var angle = Math.PI;
var theta = angle / numVertices;
angle /= -2;
for (var i = 0; i < numVertices; i++) {
// starPoints.push(newPoint3D(longRadius * Math.cos(angle), longRadius * Math.sin(angle), 0));
starPoints.push(new Point3D(longRadius * Math.cos(angle), longRadius * Math.sin(angle), 0));
angle += theta;
// starPoints.push(newPoint3D(shortRadius * Math.cos(angle), shortRadius * Math.sin(angle), 0));
starPoints.push(new Point3D(shortRadius * Math.cos(angle), shortRadius * Math.sin(angle), 0));
angle += theta;
}
return starPoints;
}
これで取りあえずクラス
コンストラクタのプロトタイプオブジェクトにメソッドを定める
前項のクラスへのメソッドの定め方には、
そこで、
コンストラクタのFunction.
// コンストラクタ関数の定義
function クラス名() {}
// メソッドの定義
クラス名.prototype.メソッド名 = function(引数) {
// メソッドの処理
}
そこで、
function Point3D(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
// this.getProjetedPoint = getProjetedPoint;
}
// function getProjetedPoint(focalLength) {
Point3D.prototype.getProjetedPoint = function(focalLength) {
var point2D = new createjs.Point();
var w = focalLength / (focalLength + this.z);
point2D.x = this.x * w;
point2D.y = this.y * w;
return point2D;
};
メソッド
function Point3D(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
}
Point3D.prototype.getProjetedPoint = function(focalLength) {
var point2D = new createjs.Point();
var w = focalLength / (focalLength + this.z);
point2D.x = this.x * w;
point2D.y = this.y * w;
return point2D;
};
var stage;
var drawGraphics;
var points;
var angle = Math.PI / 36;
var matrix = new createjs.Matrix2D();
var stageCenterX;
var _point = new createjs.Point();
var points2D = [];
var focalLength = 300;
function initialize() {
var canvasElement = document.getElementById("myCanvas");
stage = new createjs.Stage(canvasElement);
stageCenterX = canvasElement.width / 2;
drawGraphics = createGraphics(stageCenterX, canvasElement.height / 2);
points = createStarPoints(5, 65, 25);
draw(points);
createjs.Ticker.addEventListener("tick", rotate);
stage.addEventListener("stagemousemove", setAngle);
}
function setAngle(eventObject) {
var mouseX = eventObject.stageX;
angle = (mouseX - stageCenterX) * 1 / 300;
}
function rotate(eventObject) {
var count = points.length;
points2D.length = 0;
matrix.identity().rotate(angle);
for (var i = 0; i < count; i++) {
var point = points[i];
matrix.transformPoint(point.x, point.z, _point);
point.x = _point.x;
point.z = _point.y;
points2D[i] = point.getProjetedPoint(focalLength);
}
draw(points2D);
}
function createGraphics(x, y) {
var drawShape = new createjs.Shape();
drawShape.x = x;
drawShape.y = y;
stage.addChild(drawShape);
return drawShape.graphics;
}
function draw(points) {
var count = points.length;
var point = points[count - 1];
drawGraphics.clear()
.beginStroke("mediumblue")
.setStrokeStyle(3)
.moveTo(point.x, point.y);
for (var i = 0; i < count; i++) {
point = points[i];
drawGraphics.lineTo(point.x, point.y);
}
stage.update();
}
function createStarPoints(numVertices, longRadius, shortRadius) {
var starPoints = [];
var angle = Math.PI;
var theta = angle / numVertices;
angle /= -2;
for (var i = 0; i < numVertices; i++) {
starPoints.push(new Point3D(longRadius * Math.cos(angle), longRadius * Math.sin(angle), 0));
angle += theta;
starPoints.push(new Point3D(shortRadius * Math.cos(angle), shortRadius * Math.sin(angle), 0));
angle += theta;
}
return starPoints;
}
このお題は、