ใช้อัลกอริทึม Boids


18

บทนำ

boids ขั้นตอนวิธีการคือการสาธิตค่อนข้างง่ายของพฤติกรรมฉุกเฉินในกลุ่ม มันมีกฎหลักสามข้อตามที่อธิบายโดยผู้สร้าง Craig Reynolds:

แบบจำลอง flocking ขั้นพื้นฐานประกอบด้วยพฤติกรรมการบังคับเลี้ยวแบบง่าย ๆ สามแบบซึ่งอธิบายถึงวิธีการซ้อมรบของแต่ละบุคคลโดยพิจารณาจากตำแหน่งและความเร็วของฝูงสัตว์ใกล้เคียง:

  • การแยก : คัดท้ายเพื่อหลีกเลี่ยงการรวมฝูงเพื่อนในชุมชน
  • การจัดตำแหน่ง : คัดท้ายไปยังส่วนหัวเฉลี่ยของฝูงแกะในท้องถิ่น
  • การติดต่อกัน : คัดท้ายเพื่อย้ายไปยังตำแหน่งเฉลี่ยของฝูงเพื่อนในท้องถิ่น

แต่ละ boid มีการเข้าถึงโดยตรงกับคำอธิบายทางเรขาคณิตของฉากทั้งหมด แต่ flocking ต้องการให้มันตอบสนองต่อ flockmates ภายในละแวกเล็ก ๆ ที่อยู่รอบตัวเท่านั้น ละแวกใกล้เคียงมีลักษณะระยะทาง (วัดจากศูนย์กลางของ boid) และมุมวัดจากทิศทางการบินของ boid Flockmates ที่อยู่นอกพื้นที่ใกล้เคียงในพื้นที่จะถูกเพิกเฉย บริเวณใกล้เคียงอาจพิจารณารูปแบบของการรับรู้ที่ จำกัด (เช่นปลาในน้ำขุ่น) แต่มันอาจจะถูกต้องมากกว่าที่จะคิดว่ามันเป็นตัวกำหนดภูมิภาคซึ่งฝูงแกะที่มีอิทธิพลต่อการบังคับ boids

ผมไม่ได้สมบูรณ์แบบเมื่ออธิบายสิ่งดังนั้นฉันขอแนะนำให้ตรวจสอบจากแหล่งที่มา เขายังมีรูปภาพที่ให้ข้อมูลบางอย่างในเว็บไซต์ของเขา

ท้าทาย

กำหนดจำนวน boids (เอนทิตีจำลอง) และจำนวนเฟรมส่งออกแอนิเมชั่นของการจำลอง

  • boids ควรจะแสดงผลเป็นวงกลมสีแดงโดยมีเส้นด้านในวงกลมแสดงส่วนหัวของมันซึ่งเป็นทิศทางที่ boid ชี้ไป:

ภาพวาดดิบ ๆ ของ "boids" สองอันที่หันไปทางซ้ายและอีกอันหันไปทางขวา

  • มุมของแต่ละ boid (ตามที่อธิบายโดย Reynolds) ควรเป็น 300 องศาเต็ม (ไม่ใช่ 360)
  • ส่วนหัวและตำแหน่งเริ่มต้นของแต่ละ boid ควรสุ่มอย่างสม่ำเสมอ (แต่มีการหว่านเพื่อให้ผลลัพธ์ยังคงถูกกำหนด) เช่นเดียวกับตำแหน่ง
  • ถ้ารัศมีของ boid เท่ากับ 1 มากกว่ารัศมีของละแวกนั้นควรเป็น 3
  • จำนวน boids จะอยู่ที่ใดก็ได้ 2-20
  • จำนวนเฟรมจะอยู่ที่ใดก็ได้ตั้งแต่ 1-5000
  • ภาพเคลื่อนไหวควรเล่นด้วยอย่างน้อย 10 มิลลิวินาทีต่อเฟรมและสูงสุด 1 วินาทีคูณจำนวน boids (2 boids = 2 วินาทีต่อเฟรมสูงสุด 3 boids = 3 วินาทีต่อเฟรมสูงสุดและอื่น ๆ )
  • แอนิเมชันเอาต์พุตควรมีอย่างน้อย 5 boid-radii โดย 5 boid-radii, คูณครึ่งหนึ่งของจำนวน boids ดังนั้นขนาดขั้นต่ำสำหรับ 2 boids คือ 10 boid-radii โดย 10 boid-radii ขั้นต่ำสำหรับ 3 boids คือ 15 boid-radii โดย 15 boid-radii และ cetera
  • รัศมีของแต่ละ boid ต้องมีอย่างน้อย 5 พิกเซลและสูงสุด 50 พิกเซล
  • ความเร็วของการเดินเรือแต่ละครั้งจำเป็นต้อง จำกัด เพื่อไม่ให้เคลื่อนที่ได้มากกว่า 1 ใน 5 ของรัศมีในหนึ่งเฟรม
  • เอาต์พุตต้องถูกกำหนดเพื่อให้อินพุตเดียวกันจะสร้างเอาต์พุตเดียวกันหากรันหลายครั้ง
  • หาก boid มาถึงเส้นขอบมันควรห่อกลับไปด้านอื่น ในทำนองเดียวกันละแวกใกล้เคียงแต่ละ boid ควรห่อรอบชายแดน

กฎสำหรับอัลกอริทึม

ในกรณีนี้แต่ละ boid มีเซกเตอร์อยู่รอบ ๆ ซึ่งประกอบไปด้วย 300 องศาโดยมีศูนย์กลางอยู่ที่ส่วนหัวของ boid boids อื่น ๆ ใน "พื้นที่ใกล้เคียง" นี้ถือเป็น "เพื่อนบ้าน" หรือ (เพื่อใช้คำว่า Reynolds) "flockmates"

  1. ปลาแต่ละตัวควรปรับส่วนหัวเพื่อหลีกเลี่ยงการชนและรักษาระยะห่างจากรัศมี - หนึ่งกับเพื่อนบ้าน (นี่คือแง่มุม "การแยก" ของอัลกอริทึมหนึ่ง boid-radius อาจถูกบายพาส แต่มันควรจะเป็นเหมือนยางรัด

  2. แต่ละ boid ควรปรับหัวเรื่องให้ใกล้เคียงกับส่วนหัวเฉลี่ยของ boids อื่น ๆ ในละแวกนั้นด้วยตราบใดที่มันไม่เข้าไปยุ่งกับกฎข้อแรก (นี่คือส่วน "การจัดตำแหน่ง" ของอัลกอริทึม)

  3. ปลาแต่ละตัวควรหันไปหาตำแหน่งเฉลี่ยของฝูงเพื่อนตราบเท่าที่สิ่งนี้ไม่ทำให้เกิดการชนหรือรบกวนกฎที่สองอย่างมีนัยสำคัญ

ในบทความของเขาเกี่ยวกับเรื่องนี้เขาอธิบายสิ่งต่อไปนี้:

ในการสร้างฝูงจำลองเราเริ่มต้นด้วยรุ่น boid ที่รองรับการบินเชิงเรขาคณิต เราเพิ่มพฤติกรรมที่สอดคล้องกับกองกำลังของฝ่ายตรงข้ามของการหลีกเลี่ยงการชนและการกระตุ้นให้เข้าร่วมฝูง ระบุไว้สั้น ๆ เป็นกฎและเพื่อลดความสำคัญก่อนหน้านี้พฤติกรรมที่นำไปสู่การจำลอง flocking คือ:

  • การหลีกเลี่ยงการปะทะกัน: หลีกเลี่ยงการปะทะกับฝูงเพื่อนใกล้เคียง
  • การจับคู่ Velocity: พยายามจับคู่ Velocity กับ Flockmate ที่อยู่ใกล้เคียง
  • Flock Centering: พยายามอยู่ใกล้กับฝูงแกะที่อยู่ใกล้เคียง

คำอธิบายรายละเอียดเพิ่มเติมของการเคลื่อนไหว:

  • การใช้มาตรฐานของอัลกอริทึม Boids จะทำการคำนวณสำหรับแต่ละกฎและผสานเข้าด้วยกัน
  • สำหรับกฎข้อแรก boid จะผ่านรายการ boids ที่อยู่ใกล้เคียงภายในละแวกนั้นและถ้าระยะห่างระหว่างตัวมันเองกับเพื่อนบ้านนั้นน้อยกว่าค่าที่แน่นอนเวกเตอร์ที่ผลักให้ boid นั้นออกจากเพื่อนบ้านจะถูกนำไปใช้กับส่วนหัวของ boid
  • สำหรับกฎข้อที่สอง boid จะคำนวณส่วนหัวเฉลี่ยของเพื่อนบ้านและเพิ่มส่วนเล็ก ๆ (เราจะใช้ 1/10 ในการท้าทายนี้) ของความแตกต่างระหว่างส่วนหัวปัจจุบันและส่วนหัวเฉลี่ยกับส่วนหัวปัจจุบัน
  • สำหรับกฎข้อที่สามและครั้งสุดท้าย boid เฉลี่ยตำแหน่งของเพื่อนบ้านคำนวณเวกเตอร์ที่ชี้ไปยังตำแหน่งนี้ เวกเตอร์นี้ถูกคูณด้วยจำนวนที่น้อยกว่าที่ใช้สำหรับกฎ 2 (สำหรับการท้าทายนี้จะใช้ 1/50) และนำไปใช้กับหัวเรื่อง
  • จากนั้น boid จะเคลื่อนที่ไปในทิศทางที่มุ่งหน้าไป

นี่คือการดำเนินการ pseudocode ที่เป็นประโยชน์ของอัลกอริทึม Boids

ตัวอย่างอินพุตและเอาต์พุต

การป้อนข้อมูล:

5, 190 (5 boids, 190 เฟรม)

เอาท์พุท:

แอนิเมชัน 190 เฟรมของอัลกอริทึม Boids พร้อม 5 boids

เกณฑ์การชนะ

นี่คือดังนั้นทางออกที่เล็กที่สุดในหน่วยไบต์ชนะ


7
"แน่นอนว่าอัลกอริทึมนั้นมีมากขึ้นดังนั้นฉันขอแนะนำให้ตรวจสอบแหล่งที่มา" - ทุกอย่างจำเป็นที่นี่หรือไม่? ถ้าไม่ฉันขอแนะนำให้แก้ไข
Jonathan Allan

1
โดยใช้กล่องเครื่องมือก่อนที่จะท้าทายการโพสต์ตามคำแนะนำบนหน้าถาม
ข้อบกพร่อง

@ Jonathanathan Allan Yeah ทุกสิ่งที่จำเป็นอยู่ที่นี่ แต่มีคำอธิบายเชิงลึกเพิ่มเติมที่อาจทำให้ผู้ใช้รายอื่นเข้าใจได้ง่ายขึ้น
iPhoenix

11
นี่เป็นความท้าทายที่น่าสนใจ (ฉันพบพฤติกรรมที่น่าสนใจ flocking) แต่มันจะต้องมีการระบุไว้อย่างดีโดยเฉพาะอย่างยิ่งสำหรับรหัสกอล์ฟมิฉะนั้นความกดดันที่จะลดความยาวของรหัสจะทำให้เกิดการเบี่ยงเบนจากวิญญาณของความท้าทาย ถูกจูงใจ
trichoplax

คำตอบ:


7

การประมวลผล 3.3.6 (Java) ,932 931 940 928 957 917 904 ไบต์

-1 byte จากJonathan Frech
+11 bytes ให้ตรงกับspecดีกว่า
-2 bytes จากKevin Cruijssen
-12 bytes สำหรับการเปลี่ยน args เป็น t ()
+29 bytes เพราะฉันทำ ghosting ผิดดูรุ่นคอมเม้นด้านล่าง
-40 bytes สำหรับใช้ วนแทนการโทรแยกกันสำหรับ ghost
-13 ไบต์แต่ละอันสำหรับการใช้ frameRate เริ่มต้นที่ 30

มันเป็นการเริ่มต้นสำหรับคนที่ไม่ได้ใช้ Java-golf :)

int n=15,f=400,i,j,z=255,w=500;float d=200./n;PVector m;B[]a=new B[n];void setup(){size(500,500);fill(z,0,0);randomSeed(n);for(i=0;i<n;a[i++]=new B(new PVector(random(w),random(w)),m.fromAngle(random(TAU))));}void draw(){background(z);for(B b:a)b.u();if(frameCount%f<1)setup();}class B{PVector p,v,e,q,r;ArrayList<B>n;B(PVector m,PVector o){p=m;v=o;}void u(){e=v.copy();n=new ArrayList();for(B b:a){if(b!=this)for(i=-w;i<=w;i+=w)for(j=-w;j<=w;j+=w)t(i,j,b);}if(n.size()>0){q=new PVector();r=q.copy();for(B b:n){q.add(b.v);r.add(b.p);if(p.dist(b.p)<=d)e.add(p).sub(b.p);}e.add(q.div(n.size()).sub(v).div(10));e.add(r.div(n.size()).sub(p).div(50));}p.add(e.limit(d/10));v=e.mult(10);p.set((p.x+w)%w,(p.y+w)%w);noStroke();ellipse(p.x,p.y,d,d);stroke(0,0,z);line(p.x,p.y,p.x+v.x,p.y+v.y);}void t(int x,int y,B o){m=o.p.copy().add(x,y);if(2*d>=p.dist(m)&q.angleBetween(v,q.sub(m,p))<=5*PI/6)n.add(new B(m,o.v));}}

ฉันไม่ทราบวิธีที่เหมาะสมในการป้อนข้อมูลในการประมวลผลดังนั้นตัวแปรสองตัวแรกคืออินพุต (และฉันไม่ได้นับค่าของพวกเขา (5 ไบต์) ไปยังจำนวนไบต์) หากเป็นปัญหาฉันสามารถลองสิ่งอื่นได้

ฉันยังไม่รู้วิธีที่ดีในการลองออนไลน์ (โครงการ Processing.js ไม่สามารถจัดการกับสไตล์โค้ดนี้) โดยไม่ต้องโฮสต์สิ่งต่าง ๆ ด้วยตัวเอง และนั่นคือสิ่งที่ฉันไม่อยากลอง แจ้งให้เราทราบหากมีสิ่งใดที่ฉลาดที่ฉันสามารถทำได้

รหัสที่จัดรูปแบบพร้อมความคิดเห็น

int n=15, // Number of boids
    f=400, // Number of frames
    i,j,z=255,w=500; // temp*2, and two constants
float d=200./n; // Boid diameter
PVector m; // temp
B[]a=new B[n];
void setup(){ // This is automatically called at startup
  size(500,500); // Can't use variables for this without extra bytes for settings()
  fill(z,0,0);
  randomSeed(n); // seeded from number of Boids, so that n=19 is very different from n=20
  for(i=0;i<n;a[i++]=new B(new PVector(random(w),random(w)),m.fromAngle(random(TAU))));
}
void draw(){ // This is automatically called each frame
  background(z);
  for(B b:a)
    b.u();
  if(frameCount%f<1) // When desired frames length is hit, reset everything.
    setup();         // Could also use noLoop() instead of setup() to just stop instead.
                     // Or, remove this if statement altogether to go on to infinity.
}
class B{ // Boid
  PVector p,v,e,q,r; // Position, Velocity, Next velocity, and two temp vectors
  ArrayList<B>n; // List of neighbors
  B(PVector m,PVector o){
    p=m;
    v=o;
  }
  void u(){ // Update function, does rules and redraw for this Boid
    e=v.copy();
    n=new ArrayList();
    for(B b:a){ // Test a Boid and its eight ghosts for neighborship
      if(b!=this) // Note: Assumes neighborhood diameter < min(width,height)
        // The ghosts are to check if it'd be closer to measure by wrapping
        // We need eight for wrapping north, east, south, west, northeast,
        // northwest, southeast, and southwest. And also the non-wrapped one.
        // The above assumption ensures that each ghost is further apart than
        // the neighborhood diameter, meaning that only one neighbor might be
        // found for each boid. To test this, place a boid in each corner, right
        // to the edge, facing away from center. Each boid should find three
        // neighbors, that are the three other boids.
        for(i=-w;i<=w;i+=w)for(j=-w;j<=w;j+=w)t(i,j,b);
    }
    if(n.size()>0){
      q=new PVector();
      r=q.copy();
      for(B b:n){
        q.add(b.v); // Velocity matching, pt 1
        r.add(b.p); // Flock centering, pt 1
        if(p.dist(b.p)<=d)  
          e.add(p).sub(b.p); // Collision avoidance
      }
      e.add(q.div(n.size()).sub(v).div(10)); // Velocity matching, pt 2
      e.add(r.div(n.size()).sub(p).div(50)); // Flock centering, pt 2
    }
    p.add(e.limit(d/10)); // Update vectors
    v=e.mult(10);
    p.set((p.x+w)%w,(p.y+w)%w); // Wrapping
    noStroke();
    ellipse(p.x,p.y,d,d); // Draw Boid, finally
    stroke(0,0,z);
    line(p.x,p.y,p.x+v.x,p.y+v.y);
  }
  void t(int x,int y,B o){ // Test if a Boid (or a ghost) is a neighbor
    m=o.p.copy().add(x,y);
    if(2*d>=p.dist(m)&q.angleBetween(v,q.sub(m,p))<=5*PI/6)
      n.add(new B(m,o.v));
  }
}

ตัวอย่างผลลัพธ์

n = 15, เฟรม = 400:

boids

หรือภาพเคลื่อนไหวเดียวกัน แต่แสดงพื้นที่ใกล้เคียงของแต่ละตัว


1
2*PIไม่สามารถTAUบันทึกไบต์ได้ใช่ไหม
Jonathan Frech

@ JonathanFrech ใช่มันสามารถ; เดิมทีฉันมี -PI, PI และฉันกำลังจะไปทางนั้น แต่ถูกกีดกัน
Phlarx

โปรแกรมของฉัน (ซึ่งเขียนด้วย js และ html) ไม่ได้ส่งออก gif แต่มันวาดรูปและฉันใช้โปรแกรมจับภาพหน้าจอและแปลงวิดีโอที่ส่งออกเป็น gif มีสิ่งหนึ่งที่ฉันสังเกตเห็นคือ boids มีเส้นขอบสีน้ำเงินซึ่งไม่เป็นไปตามสเปค :)
iPhoenix

เพียงเตือนความจำที่เป็นมิตรอื่นคำตอบนี้ไม่เป็นไปตามข้อกำหนดดังนั้นจึงไม่ได้รับรางวัล
iPhoenix

1
ผมไม่ทราบว่าการประมวลผล แต่ผมคิดว่าคุณสามารถกอล์ฟสิ่งต่อไปนี้: ,i,ไป,i=0,แล้วลบi=0ภายในสำหรับวง (-1 ไบต์); frameCount%f==0ถึงframeCount%f<1(1 ไบต์); &&ถึง&ในขั้นสุดท้ายถ้า2*d>=p.dist(m)&q.angleBetween(v,q.sub(m,p))<=5*PI/6(-1 ไบต์) อีกครั้งไม่แน่ใจว่าสิ่งเหล่านี้เป็นไปได้หรือไม่ แต่เนื่องจากการประมวลผลนั้นค่อนข้างคล้ายกับ Java ฉันจึงคิดว่ามันเป็นเช่นนั้น นอกจากนี้คุณยังสามารถลองสร้าง GIF กับscreentogif.com
Kevin Cruijssen

4

JavaScript (ES6) + HTML5, 1200 ไบต์

นี่คือโซลูชันปัจจุบันของฉันโดยใช้ Canvas API eval()ผลตอบแทนที่ได้ฟังก์ชั่นที่มีการป้อนข้อมูลแกงกะหรี่แรกคือBoidประชากรและสองคือจำนวนของเฟรมภาพเคลื่อนไหว คุณสามารถใช้Infinityสำหรับการเคลื่อนไหวอย่างต่อเนื่อง

eval(...)เป็น 1,187 ไบต์และ<canvas id=c>13 ไบต์การรวม 1200 CSS เป็นที่ไม่จำเป็น แต่เพื่อความสะดวกก็ช่วยให้คุณเห็นขอบของผ้าใบ

eval("L7F7{function B8{t=this,t.a=o8*T,t.x=o8*S,t.y=o8*S}C=this.c,D=C.getContext`2d`,({abs:z,random:o,atan2:k,cos:u,sin:g,PI:P,T=2*P,G={c:_7A[r='filter'](b7b!=t)[i](9)79)),n:_7A[r](b7b!=t)[i](9)7({a,x,y:y-S})),s:_7A[r](b7b!=t)[i](9)7({a,x,y:y+S})),e:_7A[r](b7b!=t)[i](9)7({a,x:x-S,y})),w:_7A[r](b7b!=t)[i](9)7({a,x:x+S,y}))},M=I7[I,I+T,I-T][p]((a,x)7z(x)<z(a)?x:a)}=Math),B.prototype={d8{with(D)save8,translate(x,y),rotate(a),beginPath8,arc(0,0,5,0,T),fillStyle='red',fill8,beginPath8,moveTo(0,0),lineTo(10,0),strokeStyle='blue',stroke8,restore8},n:_7(({c,n,s,e,w}=G),c8.concat(n8,s8,e8,w8)[r](b7(d=b.x-x,f=b.y-y,400>d*d+f*f&&z(z(k(f,d)-a)/P-1)>1/6))),s8{q=(j=t.n8).length,v=t.v8||0,l=t.l8||0,f=t.f8||0,a=t.a=(t.a+v+l/10+f/50)%T,t.x=(x+u(a)+S)%S,t.y=(y+g(a)+S)%S},v:_7([d,f]=j[r](b7225>(b.x-x)**2+(b.y-y)**2)[p='reduce'](([d,f],b)7[x+d-b.x,y+f-b.y],[0,0]),d||f?M(k(f,d)-a):0),l:_7j[i](b7M(b.a-a))[p]((a,x)7a+x,0)/q,f:_7([d,f]=j[p](([d,f],b)7[d+b.x,f+b.y],[-x*q,-y*q]),d||f?M(k(f,d)-a):0)},S=C.width=C.height=50*L,A=Array(L).fill().map(_7new B),R=_7{D.clearRect(0,0,S,S),A[i='map'](b79=b).d8),A[i](b79=t=b).s8),F--&&setTimeout(R,10)},R8}".replace(/[789]/g,m=>['=>','()','({a,x,y}'][m-7]))
(10)(Infinity)
canvas{border:1px solid}
<canvas id=c>

แก้ไข

ตามที่ร้องขอตัวอย่างอื่นที่มีอินพุตสำหรับประชากร Boid:

b.onchange=()=>{eval("L7F7{function B8{t=this,t.a=o8*T,t.x=o8*S,t.y=o8*S}C=this.c,D=C.getContext`2d`,({abs:z,random:o,atan2:k,cos:u,sin:g,PI:P,T=2*P,G={c:_7A[r='filter'](b7b!=t)[i](9)79)),n:_7A[r](b7b!=t)[i](9)7({a,x,y:y-S})),s:_7A[r](b7b!=t)[i](9)7({a,x,y:y+S})),e:_7A[r](b7b!=t)[i](9)7({a,x:x-S,y})),w:_7A[r](b7b!=t)[i](9)7({a,x:x+S,y}))},M=I7[I,I+T,I-T][p]((a,x)7z(x)<z(a)?x:a)}=Math),B.prototype={d8{with(D)save8,translate(x,y),rotate(a),beginPath8,arc(0,0,5,0,T),fillStyle='red',fill8,beginPath8,moveTo(0,0),lineTo(10,0),strokeStyle='blue',stroke8,restore8},n:_7(({c,n,s,e,w}=G),c8.concat(n8,s8,e8,w8)[r](b7(d=b.x-x,f=b.y-y,400>d*d+f*f&&z(z(k(f,d)-a)/P-1)>1/6))),s8{q=(j=t.n8).length,v=t.v8||0,l=t.l8||0,f=t.f8||0,a=t.a=(t.a+v/3+l/10+f/50)%T,t.x=(x+u(a)+S)%S,t.y=(y+g(a)+S)%S},v:_7([d,f]=j[r](b7225>(b.x-x)**2+(b.y-y)**2)[p='reduce'](([d,f],b)7[x+d-b.x,y+f-b.y],[0,0]),d||f?M(k(f,d)-a):0),l:_7j[i](b7M(b.a-a))[p]((a,x)7a+x,0)/q,f:_7([d,f]=j[p](([d,f],b)7[d+b.x,f+b.y],[-x*q,-y*q]),d||f?M(k(f,d)-a):0)},S=C.width=C.height=50*L,A=Array(L).fill().map(_7new B),R=_7{D.clearRect(0,0,S,S),A[i='map'](b79=b).d8),A[i](b79=t=b).s8),F--&&setTimeout(R,10)},R8}".replace(/[789]/g,m=>['=>','()','({a,x,y}'][m-7]))(+b.value)(Infinity);b.remove()}
input{display:block}canvas{border:1px solid}
<input id=b><canvas id=c>


Boids ดูเหมือนจะไม่โต้ตอบเมื่อฉันเรียกใช้ข้อมูล
Jo King

@ โจกิ้งมันควรได้รับการแก้ไขในขณะนี้
Patrick Roberts

ปัญหาเกิดขึ้นเนื่องจากตัวขยาย babel ทำเงาตัวแปรส่วนกลางในฟังก์ชันหนึ่งด้วยชื่อพารามิเตอร์และ typecast นัยไปยังหมายเลขไม่ได้โยนข้อผิดพลาดดังนั้นฟังก์ชันก็ล้มเหลวอย่างเงียบ ๆ และไม่เคยตรวจพบเพื่อนบ้านเลย
Patrick Roberts

ฉันจะพยายามทำการสาธิตแบบโต้ตอบในคืนพรุ่งนี้ แต่ฉันหมดแรงสำหรับคืนนี้
Patrick Roberts

เพียงแค่ทราบว่า: ที่ไหนที่จะอ่านt.a+v+l/10+f/50หากคุณเปลี่ยนไปt.a+v/3+l/10+f/50เป็นมันจะสร้างพฤติกรรมที่น่าสนใจมากขึ้น แต่โปรแกรมปัจจุบันมีขนาดเล็กลงและยังคงสเป็ค
Patrick Roberts
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.