กำลังดำเนินการ 3, 815 833 835 876 879ไบต์
บันทึกสองไบต์ด้วย @ZacharyT โดยลบวงเล็บที่ไม่จำเป็นออก
void settings(){size(600,600);}int i,w,x,n;float l,d,t,a,f,g,m,R,U;float[][]N,T;float[]S,p;void s(float[][]t){N=new float[t.length+1][2];N[0][0]=N[0][1]=i=0;for(float[]q:t)N[++i]=q;translate(w=300,w);noFill();pushMatrix();f(N,0,-w,w,1,0);popMatrix();f(N,0,-w,w,0,0);}float p(float a,float b){for(a+=PI*4;a>b;)a-=PI*2;return a;}void f(float[][]P,float x,float y,float L,int c,int I){l=2*PI;d=i=0;S=null;for(;i<P.length;i++){float[]p=P[i];g=atan2(y,x);m=atan2(p[1],p[0]);if(p(f=(c*2-1)*(g-m),0)<l&(t=dist(0,0,p[0],p[1]))<=L&I!=i){l=p(f,0);S=new float[]{g,m};d=t;n=i;}}if(S==null)ellipse(0,0,2*(L-d),2*(L-d));else{arc(0,0,L*2,L*2,p(S[c],S[1-c]),S[1-c]);R=cos(a=S[1]);U=sin(a);translate(d*R,d*U);T=new float[P.length][2];for(int i=0;i<T.length;T[i][1]=P[i][1]-d*U,i++)T[i][0]=P[i][0]-d*R;f(T,(L-d)*R,(L-d)*U,L-d,c,n);}}
เรียกใช้โปรแกรมเช่นนี้:
void setup() {
s(new float[][]{{0,100},{100,100},{-200,100},{-100,-50}});
}
(ฟังก์ชั่นs
ใช้เวลาในfloat[][]
) นี่คือ testcase # 3 เป็นหลัก แต่คูณด้วย 100 เพื่อให้พอดีกับหน้าต่าง
หลายสิ่งที่ควรทราบ:
- โปรแกรมไม่ได้วาดเสา
- ภาพปรากฏพลิกคว่ำเนื่องจากในระบบพิกัดของการประมวลผลแกน y บวกจะลดลง
- เนื่องจากการประมวลผลใช้ลอยการคำนวณจึงไม่แม่นยำมากดังนั้นคุณอาจเห็นสิ่งนี้ในภาพ ฉันได้ถาม OP ว่าข้อผิดพลาดจุดลอยตัวเหล่านี้มีความสำคัญหรือไม่
- ขนาดของหน้าต่างคือ 600 พิกเซลคูณ 600 พิกเซล
- อินพุทที่มีขนาดเล็กมากจะทำให้โปรแกรมไม่ทำงานเนื่องจากสแต็ก
pushMatrix()
และการpopMatrix()
ดำเนินการสามารถเก็บ 32 เมทริกซ์ได้
- สุนัขเริ่มต้นที่ (0, -300) และโซ่เริ่มที่ความยาว 300 พิกเซล
- รูปภาพด้านล่างนี้ถูกย่อขนาดเพื่อความสะดวก
ตัวอย่างผลลัพธ์สำหรับการทดสอบข้างต้น
หากคุณต้องการที่จะเห็นการส่งออก prettified เพิ่มบรรทัดนี้ได้หลังจากที่ในการทำงานtranslate(w,w);
s
background(-1);scale(1,-1);fill(255,0,0);ellipse(0,0,25,25);fill(0);for(float[]q:N)ellipse(q[0],q[1],25,25);
และนี่ทำให้เราได้ผลลัพธ์นี้:
Ungolfed f()
และคำอธิบาย
(มีรหัสการแก้ปัญหาเช่นกัน)
void f(float[][]points, float x, float y, float len, int c, int pindex) {
print(asd+++")");
float closest = 2*PI;
float d=0,t;
float[]stuff = null;
int index = 0;
for(int i=0;i<points.length;i++) {
if(pindex != i) {
float[]p = points[i];
float originAngle = atan2(y, x);
float tempAngle = atan2(p[1], p[0]);
//println(x,y,p[0],p[1]);
float diff = c<1?tempAngle-originAngle:originAngle-tempAngle;
println("@\t"+i+"; x=\t"+x+"; y=\t"+y+"; tx=\t"+p[0]+"; ty=\t",p[1], diff, originAngle, tempAngle);
if(p(diff) < closest && (t=dist(0,0,p[0],p[1])) < len) {
println("+1");
closest = p(diff);
stuff = new float[]{originAngle, tempAngle};
d=t;
index = i;
}
}
}
if(stuff == null) {
ellipse(0,0,2*(len-d),2*(len-d));
println("mayday");
} else {
println("d angles",d,p(stuff[c],stuff[1-c],c), stuff[1-c]);
//println(points[0]);
arc(0, 0, len*2, len*2, p(stuff[c],stuff[1-c],c), stuff[1-c]);
float angle = stuff[1];
translate(d*cos(angle), d*sin(angle));
println("Translated", d*cos(angle), d*sin(angle));
println("angle",angle);
float[][]temp=new float[points.length][2];
for(int i=0;i<temp.length;i++){
temp[i][0]=points[i][0]-d*cos(angle);
temp[i][1]=points[i][1]-d*sin(angle);
println(temp[i]);
}
println(d*sin(angle));
pushMatrix();
println();
f(temp, (len-d)*cos(angle), (len-d)*sin(angle), (len-d), c, index);
popMatrix();
//f(temp, (len-d)*cos(angle), (len-d)*sin(angle), (len-d), 0, index);
}
}
เมื่อต้องการวางไว้ในไม่ช้าโปรแกรมจะส่ง "ผู้ค้นหา" สองคนหนึ่งคนไปตามเข็มนาฬิกาและอีกคนตามเข็มนาฬิกา ผู้ค้นหาเหล่านี้แต่ละคนค้นหาเสาที่อยู่ใกล้ที่สุดและดึงส่วนโค้งไปหามันถ้าโซ่นั้นยาวพอตัวอื่น ๆ ก็จะวาดวงกลม เมื่อมันดึงส่วนโค้งมันจะส่งผู้ค้นหาอีกคนไปยังเสานั้นและกระบวนการจะดำเนินต่อไป f()
มีกระบวนการของผู้สมัครแต่ละคน คำอธิบายที่ละเอียดยิ่งขึ้นจะเกิดขึ้นทันทีที่ฉันตีกอล์ฟให้มากขึ้น
{0,-.5}
คืออะไร?