编辑
这是一个正确应用长度和模型的新版本,但没有正确定位模型。我认为这可能会有所帮助。
http://codepen.io/pixelass/pen/78f9e97579f99dc4ae0473e33cae27d5?editors=001
我有2个画布实例
在模型视图上,用户可以拖动手柄来修改模型 然后,结果视图应该将模型应用于每个段(相对)
这只是分形曲线的基本l系统逻辑,尽管我在将模型应用于分段时遇到了问题。
如下图所示:红线应该复制模型,但我无法弄清楚如何正确应用逻辑
我在这里有一个演示版:http://codepen.io/pixelass/pen/c4d7650af7ce4901425b326ad7a4b259
//gcc ./cos.c -O1 -fopenmp -ffast-math -lm -mavx2
#include <math.h>
int N = 3200;
double b[3200];
double a[3200];
int main (void)
{
int i;
#pragma omp simd
for (i = 0; i < N; i += 1)
{
b[i] = cos (a[i]);
}
return (0);
}
答案 0 :(得分:0)
编写一个函数来变换给定点的点,旧原点(模型线段的起点),新原点(子线段的起点),角度和比例(已经计算过)这些):
var transformPoint = function transformPoint(point, oldOrigin, newOrigin, angle, dist) {
// subtract old origin to rotate and scale relative to it:
var x = point.x - oldOrigin.x;
var y = point.y - oldOrigin.y;
// rotate by angle
var sine = sin(angle)
var cosine = cos(angle)
var rotatedX = (x * cosine) - (y * sine);
var rotatedY = (x * sine) + (y * cosine);
// scale
rotatedX *= dist;
rotatedY *= dist;
// offset by new origin and return:
return {x: rotatedX + newOrigin.x - oldOrigin.x, y: rotatedY + newOrigin.y - oldOrigin.y }
}
您需要使用旧原点进行翻译(以便可以围绕它进行旋转),然后旋转,然后缩放,然后按新原点进行翻译。然后返回点。
modelLogic [0]是旧的原点,因为它定义了模型中段的起点,而点[0]是新的原点,因为它是变换映射到的原点。
您可以通过drawModel函数调用该函数,如下所示:
let p1 = transformPoint(modelLogic[0], modelLogic[0], points[0], angle, dist);
let p2 = transformPoint(modelLogic[1], modelLogic[0], points[0], angle, dist);
let p3 = transformPoint(modelLogic[2], modelLogic[0], points[0], angle, dist);
let p4 = transformPoint(modelLogic[3], modelLogic[0], points[0], angle, dist);
let p5 = transformPoint(modelLogic[4], modelLogic[0], points[0], angle, dist);
并更改您的绘图代码以使用返回的点p1,p2等而不是x1,y1,x2,y2等。
或者,您可以创建一个矩阵来表示所有这些平移,旋转和缩放变换,并依次变换每个点。