gpt4 book ai didi

actionscript-3 - 解决均匀分布/均匀间隙螺旋点的算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:35:12 25 4
gpt4 key购买 nike

首先,为了直观地了解我所追求的,这是我找到的最接近的结果(但不完全是我所追求的)图像:

enter image description here

这是完整的站点引用:http://www.mathematische-basteleien.de/spiral.htm

但是,它并不能完全解决我要解决的问题。我想存储一个非常具体的螺旋算法的点数组。

  • 点分布均匀
  • 360 度周期有一个均匀的间隙

如果我没记错的话,前两点应该是:

  • 点[0]=新点(0,0);
  • 点[1]=新点(1,0);

但是从这里到哪里去呢?

我想提供的唯一论点是:

  • 我希望解决的点数(数组长度)。
  • 每个点之间的距离(像素间隙)。
  • 周期之间的距离。

对我来说,这几乎听起来我必须计算“螺旋周长”(如果有这样的术语)以便沿着螺旋绘制均匀分布的点。

您认为 2*PI*radius 能否可靠地用于此计算?

如果以前做过,请展示一些代码示例!

最佳答案

有趣的小问题:)

如果你仔细看图,顺序很清楚:

spiral diagram

绘制这些可能有很多解决方案,也许更优雅,但这是我的:

你知道斜边是当前段数+1的平方根三角形的对边总是 1。

您还知道角度的 Sine(Math.sin) 等于对边除以斜边。来自旧的助记符 SOH(Sine,Opposite,Hypotenuse),-CAH-TOA。

Math.sin(angle) = opp/hyp

您知道角度的正弦值,您知道两侧,但您还不知道角度,但您可以为此使用反正弦函数 (Math.asin)

angle = Math.asin(opp/hyp)

现在您知道了每段的角度,并注意到它随着每条线的增加而增加。

现在您已经有了角度和半径(斜边),您可以使用极坐标笛卡尔 公式来转换角度、半径x,y 对配对。

x = Math.cos(angle) * radius;
y = Math.sin(angle) * radius;

既然你要求一个actionscript解决方案,Point类已经通过polar()为你提供了这个功能。方法。您向它传递一个半径和角度,它会在 Point 对象中返回您的 x 和 y。

这是一个绘制螺旋线的小片段。您可以通过在 Y 轴上移动鼠标来控制段数。

var sw:Number = stage.stageWidth,sh:Number = stage.stageHeight;
this.addEventListener(Event.ENTER_FRAME,update);
function update(event:Event):void{
drawTheodorus(144*(mouseY/sh),sw*.5,sh*.5,20);
}
//draw points
function drawTheodorus(segments:int,x:Number,y:Number,scale:Number):void{
graphics.clear();
var points:Array = getTheodorus(segments,scale);
for(var i:int = 0 ; i < segments; i++){
points[i].offset(x,y);
graphics.lineStyle(1,0x990000,1.05-(.05+i/segments));
graphics.moveTo(x,y);//move to centre
graphics.lineTo(points[i].x,points[i].y);//draw hypotenuse
graphics.lineStyle(1+(i*(i/segments)*.05),0,(.05+i/segments));
if(i > 0) graphics.lineTo(points[i-1].x,points[i-1].y);//draw opposite
}
}
//calculate points
function getTheodorus(segments:int = 1,scale:Number = 10):Array{
var result = [];
var radius:Number = 0;
var angle:Number = 0;
for(var i:int = 0 ; i < segments ; i++){
radius = Math.sqrt(i+1);
angle += Math.asin(1/radius);//sin(angle) = opposite/hypothenuse => used asin to get angle
result[i] = Point.polar(radius*scale,angle);//same as new Point(Math.cos(angle)*radius.scale,Math.sin(angle)*radius.scale)
}
return result;
}

这本来可以写得更少,但我想把它分成两个函数:一个只处理计算数字,另一个处理画线。

下面是一些截图:

spiral 1

spiral 2

spiral 3

为了好玩,我使用 ProcessingJS 添加了一个版本 here .运行速度有点慢,所以我会为此推荐 Chromium/Chrome。

现在您可以在此处实际运行此代码(上下移动鼠标):

var totalSegments = 850,hw = 320,hh = 240,segments;
var len = 10;
points = [];
function setup(){
createCanvas(640,480);
smooth();
colorMode(HSB,255,100,100);
stroke(0);
noFill();
//println("move cursor vertically");
}
function draw(){
background(0);
translate(hw,hh);
segments = floor(totalSegments*(mouseY/height));
points = getTheodorus(segments,len);
for(var i = 0 ; i < segments ; i++){
strokeWeight(1);
stroke(255-((i/segments) * 255),100,100,260-((i/segments) * 255));
line(0,0,points[i].x,points[i].y);
// strokeWeight(1+(i*(i/segments)*.01));
strokeWeight(2);
stroke(0,0,100,(20+i/segments));
if(i > 0) line(points[i].x,points[i].y,points[i-1].x,points[i-1].y);
}
}
function getTheodorus(segments,len){
var result = [];
var radius = 0;
var angle = 0;
for(var i = 0 ; i < segments ; i++){
radius = sqrt(i+1);
angle += asin(1/radius);
result[i] = new p5.Vector(cos(angle) * radius*len,sin(angle) * radius*len);
}
return result;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.4/p5.min.js"></script>

关于actionscript-3 - 解决均匀分布/均匀间隙螺旋点的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com