如何检测beginShape / vertex中的相交线?

时间:2014-05-26 00:08:10

标签: processing

我有这个非常基本的代码。我试图使用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
}

1 个答案:

答案 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);
}
相关问题