我有这个非常基本的代码。我试图使用beginShape(); ...
生成随机形状我的画布的co or oranceance映射到一个数组中。然后,vertex()点从该数组中选择一个随机点来形成形状。
到目前为止,我只使用4个顶点。
问题是:顶点线条保持纵横交错并且看起来不自然。如果一个co一致性小于另一个,则线条相交 - 不是我想要的。
我需要类似......
if(randomPointOne行与randompoint三行相交){ 改变randomPointOne的方向 }
问题:如何检测线是否相交,然后避免这种情况发生?
仍在学习代码。感谢。
PVector pt1 = new PVector(0, 0); // Top Left
PVector pt2 = new PVector(160, 0); //Top middle
PVector pt3 = new PVector(320, 0); // Top Right
PVector pt4 = new PVector(480, 0); // middle right
PVector pt5 = new PVector(640, 0); // middle right
PVector pt6 = new PVector(0, 160); // Middle Cent
PVector pt7 = new PVector(160, 160); // Middle Left
PVector pt8 = new PVector(320, 160); // bottom right
PVector pt9 = new PVector(480, 160); // bottom Cent
PVector pt10 = new PVector(640, 160); // bottom Cent
PVector pt11 = new PVector(0, 320); // Middle Cent
PVector pt12 = new PVector(160, 320); // Middle Left
PVector pt13 = new PVector(320, 320); // bottom right
PVector pt14 = new PVector(480, 320); // bottom Cent
PVector pt15 = new PVector(640, 320); // bottom Cent
PVector pt16 = new PVector (0, 480); // bottom Left
PVector pt17 = new PVector(160, 480); // Top Left
PVector pt18 = new PVector (320, 480); //Top middle
PVector pt19 = new PVector(480, 480); // Top Right
PVector pt20 = new PVector(640, 480); // bottom Cent
int [] pvPoint = new int [11];
void setup() {
size(640, 640, P3D);
background(10);
smooth();
frameRate(2);
}
void draw() {
background(10);
//textVis();
rect1();
}
void rect1() {
int r1 = int ( random (0,9) );
int r2 = int ( random (0,9) );
int r3 = int ( random (0,9) );
int r4 = int ( random (0,9) );
pvPoint[0] = 0;
pvPoint[1] = 160;
pvPoint[2] = 160/2;
pvPoint[3] = 320;
pvPoint[4] = 320/2;
pvPoint[5] = 480;
pvPoint[6] = 480/2;
pvPoint[7] = 640;
pvPoint[8] = 640/2;
int randOne = pvPoint[r1];
int randTwo = pvPoint[r2];
int randThree = pvPoint[r3];
int randFour = pvPoint[r4];
stroke(#72DF2F);
strokeWeight(3.5);
beginShape();
fill(#72DF2F);
vertex( randOne, pt1.x ); //pt1
fill(#E54B98);
vertex( randTwo, pt5.y );// pt5
fill(#43B3E5);
vertex( randThree, pt20.y+160 );// pt20
fill(#D9CE4A);
vertex( randFour, pt16.y+160 );// pt16
endShape(CLOSE);
stroke(#8C0012);
ellipse( randOne, pt1.y, 7, 7 ); //pt1
stroke(#018C1E);
ellipse( randTwo, pt5.y, 7, 7 );// pt5
stroke(#D2D930);
ellipse( randThree, pt20.y+160, 7, 7 );// pt20
stroke(#0C208C);
ellipse( randFour, pt16.y+160, 7, 7 );// pt16
}
答案 0 :(得分:3)
嗯......这个其他方法怎么样?只是草稿,可以轻松适应任意数量的顶点... 我使用trig以正确的顺序获取值:)
void setup() {
size(400, 400);
frameRate(4);
}
void draw() {
makeShape();
}
void makeShape() {
float a, b, c, d;
a =random(0, PI/2);
b =random(PI/2, PI);
c =random(PI, PI*1.5);
d =random(PI*1.5, PI*2);
float magA = random(15, 50);
float magB = random(15, 50);
float magC = random(15, 50);
float magD = random(15, 50);
PVector[] vtx = new PVector[4];
vtx[0] = new PVector(cos(a)*magA, sin(a)*magA);
vtx[1] = new PVector(cos(b)*magB, sin(b)*magB);
vtx[2] = new PVector(cos(c)*magC, sin(c)*magC);
vtx[3] = new PVector(cos(d)*magD, sin(d)*magD);
translate(random(width), random(height));
beginShape();
vertex(vtx[0].x, vtx[0].y);
vertex(vtx[1].x, vtx[1].y);
vertex(vtx[2].x, vtx[2].y);
vertex(vtx[3].x, vtx[3].y);
endShape(CLOSE);
}
这里有一个版本,它接受两个参数的顶点数和每个多边形的最大尺寸:
void setup() {
size(800, 800);
frameRate(4);
}
void draw() {
fill((frameCount*2)%255);
int sides = 2 + frameCount/5;
// makeSides(int sides, int max magnitude);
makeShape(sides, 100);
println(sides + " sides");
}
void makeShape(int sides, int maxSize) {
sides = sides >= 2? sides:2;
float a, b, c, d;
float slice = TWO_PI/(float) sides;
float[] angles = new float [sides];
for (int i = 0; i < angles.length; i++ ) {
angles[i] = random(slice*i, slice * (i+1));
}
float[] mags = new float [sides];
for (int i = 0; i < mags.length; i++ ) {
mags[i] = random(15, maxSize);
}
PVector[] vtx = new PVector[sides];
for (int i = 0; i < vtx.length; i++ ) {
vtx[i] = new PVector(cos(angles[i])*mags[i], sin(angles[i])*mags[i]);
}
translate(random(width), random(height));
beginShape();
for (int i = 0; i < vtx.length; i++ ) {
vertex(vtx[i].x, vtx[i].y);
}
endShape(CLOSE);
}