一.簡介
圓錐,數學領域術語,有兩種定義。
解析幾何定義:圓錐面和一個截它的平面(滿足交線為圓)組成的空間幾何圖形叫圓錐。
立體幾何定義:以直角三角形的一條直角邊所在直線為旋轉軸,其余兩邊旋轉形成的面所圍成的旋轉體叫做圓錐。該直角邊叫圓錐的軸 。
二.圓錐模擬
通過以上兩個定義,我可以模擬出圓錐上所有的點:
JavaScript Code復制內容到剪貼板
- var pointPositions = [];
- for (var i = -100; i < 200; i += 10) {
- var xTemp = getRandomNumber(-i, i);
- var zTemp = Math.sqrt(Math.abs(i * i - xTemp * xTemp));
- pointPositions.push(new Vector3(xTemp, i, zTemp));
- }
i 既是h,又是半徑r。
這個時候,我們生成的 Z都是大於零的,不過沒有關系,我們等下可以通過旋轉來補齊所有的點。
三.旋轉與投影
JavaScript Code復制內容到剪貼板
- //旋轉
- function rotate(angle) {
-
- for (var i = 0; i < pointPositions.length; i++) {
- var tempX = pointPositions[i].x;
- var tempZ = pointPositions[i].z;
- pointPositions[i].x = pointPositions[i].x * Math.cos(angle) - pointPositions[i].z * Math.sin(angle);
- pointPositions[i].z = pointPositions[i].z * Math.cos(angle) + tempX * Math.sin(angle);
- }
- }
- //投影
- function projection(v) {
- var v1 = new Vector3();
- v1.x = v.x * distance / Math.abs(cameraPosition.z - v.z);
- v1.y = v.y * distance / Math.abs(cameraPosition.z - v.z);
- v1.z = v.z;
- return v1;
- }
四.動畫
JavaScript Code復制內容到剪貼板
- var currentAngle = 0;
- var roundAsync = eval(JScex.compile("async", function () {
- while (true) {
- pointPositionsForShow.length = 0;
- currentAngle += 0.1;
- rotate(degToRad(currentAngle));
- PositionsProjection();
- for (var i = 0; i < pointPositionsForShow.length; i++) {
- cxt.fillStyle = randomColor();
- cxt.beginPath();
- if (pointPositionsForShow[i].z > 0) cxt.globalAlpha = 1;
- if (pointPositionsForShow[i].z < 0) cxt.globalAlpha = 0.1;
- cxt.arc(centreOfCirclePosition.x + pointPositionsForShow[i].x, centreOfCirclePosition.x + pointPositionsForShow[i].y, distance / Math.abs(cameraPosition.z - pointPositionsForShow[i].z), 0, Math.PI * 2, true);
- cxt.closePath();
- cxt.fill();
- }
- $await(JScex.Async.sleep(50));
- }
- }))