ฮฬฬฬฬˆˆˆฌชชชฌˆˆˆฌฬฬฬฌฬภฬฌฬภฬฌฬภฬฬฬ์๎ˆˆฬ๎ชชภ๎ˆจภ๎ฬฌภฬภฌภภภฌภภภฌภภฮฬฬฬฬˆˆˆฌชชชฌˆˆˆฌฬฬฬฌฬฬฬฌฬภฬฌฬภฬฬฬ์๎ˆˆฬ๎ชชภ๎ˆจภ๎ฬฌภฬฬฌภภภฌภภภฌภภฌฬฬฬฌชชชฌชฌชฌชสฬฌชชชŒˆˆˆฬภฬฮฬฬฮฬฌฬชชภ์ฌชภ๎ชชภ๎ชชภ๎ˆˆฬ๎ภ์๎ฬฬ๎๎ฌฬฬฬฌชชชฌชฌชฌชสฬฌชชชŒˆˆˆฬภฬฮฬฬฮฬฌฬชชภ์ฌชภ๎ชชภ๎ชชภ๎ˆˆฬ๎ภ์๎ฬฬ๎๎ >ภ?™™ ™™™™™™™ ปป ™™™™™ฐปปป™™™™™ปป ปปปป ™™™™™ฐปปปฐปปปปป™™™™™ปปปป ฐปปปปป™™™™™ฐปปปปปฐปปปปป™™™™™™ ฐปปปปปฐปปปปป™™™™™™™ฐปปปปปฐปปปป›™™™™™™ ฐปปปปปปปปป™™™™™ ˆˆธปปปปป™™ ฐปปป™™™™™ €ˆˆˆปปปป ™™™ปป ™™™™™ ˆˆˆˆธปปป™™™™ ™™™™™‰ˆˆˆˆˆปป ™™™™™ˆˆ™™™™™‰ˆˆˆˆˆ™™™™™€ˆˆˆ™™™™€ˆˆˆˆˆ™™™™™ˆˆˆˆ™™™ €ˆˆˆˆˆ™™™™™€ˆˆˆˆˆ™ˆˆˆˆˆˆˆˆ ชช™™™™™€ˆˆˆˆˆ€ˆˆˆˆˆˆˆชชช ™™™™ €ˆˆˆˆˆˆˆˆˆˆˆˆˆ ชชชช™™™€ˆˆˆˆˆ€ˆˆˆˆˆˆˆชชชชช™‰ˆˆ€ˆˆˆˆˆ€ˆˆˆˆˆชชชชชˆˆˆˆˆˆˆ€ˆˆˆˆˆฐปปชชชชช€ˆˆˆˆ€ˆˆˆˆˆ€ˆˆˆˆˆปปปซชชชชˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆธปปปปชชชชˆˆˆˆˆ€ˆˆˆˆˆˆˆˆปปปปปซชชชชช ˆˆˆˆˆˆˆˆˆˆˆˆˆˆปปปปปซชช  ชชชˆˆˆˆˆˆˆˆˆˆ™™ ปปปปปซชชชชชชŠˆˆˆˆˆˆˆˆˆ˜™™™ปปปปปซชช  ชชชชชˆˆˆˆชชˆˆˆˆˆ™™™™นปปปปซชชช ชชชชชˆˆˆจชชˆˆˆˆ˜™™™™™ปปปปชชชช ชชชชช€ˆˆชชชŠˆˆˆ˜™™™™™ปปปซชชชช ชชชชชชชชชชˆˆˆ˜™™™™™ฐปปชชชชช ชชชชชชชชชชŠˆˆ˜™™™™™ˆˆˆจชชชชชชชชˆˆชชชชชŠˆˆˆ™™™™™ˆˆˆˆชชชช ชชŠˆˆˆชชชชชˆˆˆˆ˜™™™‰ˆˆˆˆจชชชชชˆˆˆˆจชชชŠˆˆˆˆˆ™™™ˆˆˆˆˆจชช €ˆˆˆˆˆชชชŠˆˆˆˆˆ™™™ˆˆˆˆˆจชช€ˆˆˆˆˆŠˆˆŠˆˆˆˆˆ™™™‰ˆˆˆˆ˜™™ ชช €ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™ˆˆˆˆ˜™™™ ชชช€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™‰ˆˆˆ™™™™ชชชชŠˆˆˆˆˆˆˆˆˆˆˆˆˆ˜™™™™‰ˆˆ˜™™™™ ชชชชชˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™‰ˆˆ™™™™™ ชชชชช€ˆˆˆˆˆˆˆˆˆˆ™™™™™™™™™™™™™ ชชชชช ˆˆˆˆˆˆˆธปปป™™™™™™™™™™™™™ ชชชชชชชช ˆˆˆˆˆธปปป›™™™™™™™™™™™™ ชชชชชชชชช€ˆˆˆˆปปปปป™™™™™™™™นปป ชชชชชชชชช ˆˆˆธปปปปป˜™™™™™™™นปป  ชชชชชชชช €ˆˆฐปปปปปˆˆˆ™™™™™นปปปชช ชชชชช ˆˆˆธปปปปปˆˆˆ˜™™™™นปปปชชชชชŠˆˆˆˆปปปปปˆˆˆˆ™™™™ปปปปฐปปชชชชชŠˆˆˆˆธปปป‹ˆˆˆˆ™™™นปปปปปปป  ชชชชˆˆˆˆˆธปปปˆˆˆˆˆ™™™นปปปปฐปปปปชชช ˆˆˆˆˆธปปป‹ˆˆˆ˜™™™™ปปปปปปปปป €จชชˆˆˆˆˆธปปปปˆˆˆ™™™™™นปปปปปปปป ˆˆˆˆˆˆˆˆˆธปปปปˆˆˆ™™™™™นปป ปปปปป €ˆˆˆˆˆ€ˆˆˆˆปปปปปˆˆˆ™™™™™นˆˆปปปปป €ˆˆˆˆˆˆˆˆธปปปปปˆˆ˜™™™™™‰ˆˆˆปปปปป €ˆˆˆˆˆ‰ˆˆฐปปปปป™™™™™™™™‰ˆˆˆ ชบปปปป€ˆˆˆˆˆ™™™ปปปป›™™™™™™™™ˆˆˆˆชชชปปป €ˆˆˆˆˆ™™™™ ฐปปป™™™™™™™™‰ˆˆˆˆ ชชชบปปˆˆˆˆ˜™™™™™ ชช›™™™™™ ชช€ˆˆˆˆชชชชช €ˆˆˆ™™™™™ชชชš™™™™™ชชชŠˆˆˆˆชชชชช ˆˆˆ˜™™™™ฉชชชช™™™™ฉชชชชˆˆˆˆชชชชช €ˆˆˆ˜™™™™ชชชชชš™™™ชชชชชŠˆˆˆชชชชช ˆˆˆˆ˜™™™™ชชชชชš™™™ชชชชชŠˆˆˆชชชชช ˆˆˆˆˆ™‰ˆˆชชชชช นปปชชชชช ˆˆ Šˆˆชˆˆˆˆˆ˜ˆˆˆชชชชช ปปปซชชชชŠˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆชชชชชบปปปปชชชชŠˆˆˆ€ˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆจชชชชปปปปปซชชชˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆชชช ปปปปปซชชŠˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆจชช ปปปปปซชชŠˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ˜™™ˆˆˆˆˆจชชชปปปปปซชชชˆˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™‰ˆˆˆˆจชชชปปปปปซชชชŠˆˆˆˆˆˆˆˆˆˆˆˆˆ˜™™™™ˆˆˆˆชชชชบปปปปชชชชŠˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆ™™™™™‰ˆˆจชชชชชปปปซชชชชŠˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆ™™™™™‰ˆˆ ชชชชบปปปชชชชช ˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆ™™™™™ ™™ฉชชชชปปปปชชชชชบปปป€ˆˆˆˆˆ™™ชช €ˆˆˆˆˆˆˆ™™™™™™™™™ชชชบปปปปซชชชชปปปป€ˆˆˆˆˆ™™™  ชชชˆˆˆˆˆˆˆˆ™™™™™™™™™ฉชชบปปปปปชชชบปปปป€ˆˆˆˆˆ™™™™ชชชชŠˆˆˆˆˆˆˆ˜™™™™™™™™™Šˆธปปปปป ชชฐปปปป€ˆˆˆˆˆ™™™™™ฉชชชชชˆˆˆˆˆˆˆˆ™™™™™™™™™ˆˆธปปปปปชชชบปปปป€ˆˆˆˆˆ™™™™™ฉชชชชชˆˆˆˆˆˆˆˆ˜™™›™™™™™ˆˆธปปปปซชชชชปปปปˆˆˆˆ™™™™™ฉชชชชชˆˆˆˆˆˆˆˆˆปป›™™™™™ˆˆˆปปปปชชชชชบปปป€ˆˆˆ™™™™™ฉชชชชชˆˆˆˆˆˆˆˆˆปป›™™™™™ˆˆˆธปปปชชชชชบปปปปป ™™™™™ฉชชชชชˆจชชˆˆˆˆˆปปป™™™™‰ˆˆˆˆซชชชชชชชบปปปฐปปป™™™™ชชชช €ชชชŠˆˆˆธปปป˜™™™ˆˆˆˆˆชชชชชชชช ปป  ชชปปปป ™™™ˆˆจชชช ชชชชˆˆˆปปป‹ˆ™™ ˆˆˆˆจชชชชชชชชชชชชชชชบปปปปปปป›™‰ˆˆˆชชบปชชชชชŠˆธปปปˆˆˆˆ€ˆˆˆชชชชชชชชชชชชชฐปป ชชชชปปปปปปปปˆˆˆˆปปปชชชชช ™™นป‹ˆˆˆˆˆˆˆˆชชชชชชชชชชชชชปปป ชชชชชบปปปปปปป‹ˆˆˆˆˆปปปชชชชชš™™™ป‹ˆˆˆˆˆ€ˆˆˆชชชชชชชช ชชชชฐปปปป ชชชชชชชบปปปปปปป‹ˆˆˆˆˆปปปชชชชชš™™™น‹ˆˆˆˆˆˆˆˆชชชชชบปปซชชชชปปปปป ชชช ชชชชชบปปปปปปป‹ˆˆˆˆˆปปปชชชชชš™™™ป‹ˆˆˆˆˆˆˆˆˆชชชชชบปปปชชชชปปปปปซชชชชชชชชชบปปปปปปป‹ˆˆˆˆˆปปปซชชชช™™™นป‹ˆˆˆˆˆˆˆˆˆจชชชชปปปปซชชชปปปปปซชชชชชชชชชบปปปปปปป‹ˆˆˆˆˆปปปปชชชš™™™ปปปˆˆˆˆˆˆˆˆˆชชชบปปปปซชชชปปปปปซชชชชชชชชช™ปปปปปปปปˆˆˆˆธปปปปซชช™™นปปป‹ˆˆˆˆˆˆˆˆชชชปปปปปซชชชปป  ชชปปปปซชชชช ชชชš™™ปปปปป‹ˆˆˆฐปปปป™™นปปปปˆˆˆˆˆˆˆจชชชปปปปปซชชชฐปปปชชชบปปปชชชช™™ฉชช™™™ ฐปปปปปปˆˆปปปป›™™™™นปปปปปˆˆˆˆˆจชชชปปปปปชชชชปปปป  ชชชชปป ชชชš™™™™™™™™ปปปปปปปปปฐปปปป™™™ ฐปปปปปป›™™€ˆˆˆˆชชชชบปปปซชชชชฐปปปปปชชชชชบซชชชช™™™™™™™™™™ปปปปปปปปปปปปป›™™™™ปปปปปปป™™™ ˆˆˆจชชชชช‹ˆˆซชชชชฐปปฐปปปปปชชชชช ชชชชš™™™™™™™™™™ปปปปปปปปปปปปป™™™™™นปปปปปป›™™™™€ˆˆชชชชชชˆˆˆจชชชชปปป ฐปปปปปชชชชชชชชชชš™™™™™™™™™™ปปปปปปปปปปปปป™™™™™ปปปปปปป™™™™™ ชชชชชชชŠˆˆˆˆชชชชฐปปปปฐปปปปปชชชชชชชชชชš™™™™™™™™™™ปปปปปปปปปปปปป™™™™™ปปปปปปป™™™™™ฉชชชชชชชˆˆˆˆˆจชชชปปปปป ฐปปปปปชชชชชชชชชชš™™™™™™™™™นปปปปปปปปปปปปป™™™™™ปปปปป ™™™™™ฉชชชชชชชˆˆˆˆˆจชชชปปปปป ปป ปปปป  ชชชชชชชชชš™™™™™™™™ปปปปปปปปปปปปปป™™™™™ปปปปป ™™™™™ฉชชชชŠˆˆˆˆˆˆˆจชชชปปปปป ฐปปปฐปปป™ชชช ชชชชช ™™™™ ™™‰ธปปปป™ปปปซชปปˆ˜™™™™ปปปปป ™™™™™ฉชชชชŠˆˆˆˆˆˆˆชช ปปปปป ปปปป ™™น ™ฉชชชชชชช ™™™™™€ˆˆปปป›™นปปชชบ‹ˆˆ™™™™™ปปปป™™™™ชชชชชŠˆˆˆˆˆˆˆˆˆˆˆˆˆปปปปป ฐปปปปป™™™™™™™  ชชชชปป™™™™™ ˆˆˆธปป™™™ ชชชชˆˆˆ˜™™™™นป›™™™™™ ชชชชชŠˆˆˆˆˆˆˆˆˆˆˆ€ˆˆˆชชบปปปปป ฐปปปปป™™™™™™™™™™™ชชชบปป ™™™™ˆˆˆˆˆ™™™™ชชชชชŠˆˆˆ˜™™™™ป™™™ ™™ ชชชชˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ ชชชปปปปปปฐปปปปป™™™™™™™™™™™™ฉชชปปปป™™™™™‰ˆˆˆˆ™™™™ชชชชชŠˆˆˆ™™™™™™™™™™™™™ ชชชŠˆˆˆˆˆˆˆ€ˆˆˆˆ€ˆˆˆˆˆชชชชบปปปปปปปปปปป™™™™™™™™™™™™™™ปปปปป™™™™™‰ˆˆˆˆ™™™™ชชชชชŠˆˆˆ™™™™™™™™™™™™™™™™ฉชช‰ˆˆˆˆ™™™‰ˆˆˆˆ€ˆˆˆˆˆ ชชชชชฐปปปปปปปปปป™™™™™™™™™™™™™™นปปปป™™™™™‰ˆˆˆˆ™™™™ชชชชชŠˆˆˆ™™™™™™™™™™™™™™™™™™™™ˆˆˆ˜™™™™ˆˆˆˆ€ˆˆˆˆˆ ชชชชชฐปปปปปปปปป›™™™™™™™™™™™™™™นปปปป™™™™™‰ˆˆˆˆ™™™™ชชชชชŠˆˆˆ™™™™™™™™™™™™™™™™™™™™ˆˆˆ™™™™™‰ˆˆˆ€ˆˆˆˆˆ ชชชชชฐปปปปปฐปปป™™™™™™™™™™™™™™นปปปป™™™™™‰ˆˆˆธ›™™™ ชชชชˆˆˆˆ™™™™™™™™™™™™™™™™™™™™ˆˆˆ™™™™™™™‰ˆ€ˆˆˆˆˆชชชชชชชฐปปปปปปป ™™™™ ชชš™™™™™นปปปป›™™™™€ˆˆˆปป™™™™ฉชช €ˆˆˆ˜™™™™™™™™™™™™™™™™™™™ป‹ˆ™™™™™™™™ˆ™™ˆˆˆˆจชชชชชชชฐปปปปป€ˆˆ™™™ ชชช™™™™™นปป‹ˆˆ™™™™™‰ˆธปป›™™™™ชชปป‹ˆˆˆ™™™™™™™™™™™™™™™™™™™ปป™™™™™™™™ ™™‰ˆˆˆชชชชชชชš™ปปปป ˆˆˆช™™ ชชชชš™™™™ปปˆˆˆ˜™™™™™ปปปปป™™™™ ฐปปปˆˆˆ˜™™™™™™ฉชš™™™™™™™™นปป ™™™™™™™™™™™™™ˆˆจชชชชชชช™™นปปป€ˆˆˆˆ ชชชช ชชชชช™™™™™ฐ‹ˆˆˆˆ™™™™นปปป›™™™™™ปปปป‹ˆˆˆ˜™™™™™ชชช™™™น›™™™ปปปป™™™™™™™™™™™™™™ชชชชชชชš™™™ปป ˆˆˆˆˆจชชชชชชชชชช™™™™ ˆˆˆˆˆ˜™™™™™ปปป›™™™™™ปปปปปˆˆˆ™™™™™ฉชชชš™™ปป™™นปปปป™™™™™™™™™™™™™™ชชชชช ™™™™™ˆˆˆˆˆจชชชชชชชชชช™™™™ˆˆˆˆˆ˜™™™™™ปปป›™™™™™ปปปปปˆˆˆ™™™™™ชชชชชบปปปปปปปปปป™™™™™™™™™™™™™™ชชชชช ™™™™™ˆˆˆˆˆจชชชชชชชชชช™™™™™‰ˆˆˆˆ˜™™™™™ปปป›™™™™™ปปปปปˆˆˆ™™™™™ชชชชชบปปปปปปปปปป™™™™™™™™™™™™™™ชชชชช ™™™™™ˆˆˆˆˆจชชชชชชชชชช™™™™™‰ˆˆˆˆ˜™™™™™ปปป›™™™™™ปปปปปˆˆˆ™™™™™ชชชชชบปปปปปปปปปป™™™ ™™™™ ™™™™™ ชชชช™™™™™ˆˆˆˆˆจชชชช ชชชช ™™™™™‰ˆˆˆˆ˜™™™™™ปปป™™™™นปปปปปˆˆˆ™™™™™ชชชชชบปปปปปปปปป›™™™ ™™™ฐปปฐปป™™™™ ชชชชชŠˆˆ™™™™™™™ˆˆˆˆ ชชชชˆˆจชชˆˆ™™™™™‰ˆˆˆˆˆ™™™™ฉบป ™™™™™ปปปปป‹ˆˆˆ›™™™™ชชชชชบปปปปปฐปปป™™™™ ™ปป ปปป ปปป›™™™ ชชชชชˆˆˆ˜™™™ ™™™‰ˆˆ˜™ฉชชŠˆˆˆชŠˆˆ™™™™™™™‰ˆˆˆ˜™™™ชช™™™™นปปปปปˆˆˆธป™™™ฉชชชชชˆˆปปป› ปป›™™™™ ฐปปปฐปปปปฐปปปป™™ ชชชช €ˆˆˆˆ™™™™™™™ˆˆ™™™ชชˆˆˆˆˆˆˆ˜™™™™™™™ˆˆˆˆ™™ฉชช ™™™™นปปปปป‹ˆˆธปป›™™ชชชชชŠˆˆธปป™™ปป›™™ปป ปปปปปปปปป ปปปปป  ชชชชชˆˆˆˆˆ˜™ ™™™™™ ™™™™ €ˆˆˆˆˆˆˆˆˆ™™™™™™™‰ˆˆˆจชชชชช™™™™™ปปป‹ˆˆˆˆˆปปปปชชชชชชˆˆˆˆป›™™นปป™นปปปฐปปปปปปปปป ปปปปป  ชชชชชˆˆˆˆˆ™™™™™™™™™™™€ˆˆˆˆˆˆˆˆˆ˜™™™™™™™ˆˆˆจชชชชช™™™™™ปปป‹ˆˆˆˆˆปปปซชชชชชˆˆˆˆˆ˜™™™™ปป›ปปปปปปปปปปปปปป ปปปปป  ชชชชชˆˆˆˆˆ™™™™™™™™™™™€ˆˆˆˆˆˆˆˆˆˆ™™™™™ˆˆˆจชชชชช™™™™™ปปป‹ˆˆˆˆˆปปปซชชชชชˆˆˆˆˆ˜™™™™ปปปปปปปปปปปปปปปปป ปปปปป  ชชชชชˆˆˆˆˆ™™™™™™™™™™™€ˆˆˆˆˆˆˆˆˆˆ™™™™™ˆˆˆจชชชชช™™™™™ปปป‹ˆˆˆˆˆปปปซชชชชชˆˆˆˆˆ˜™™™™ปปปปปปปปปปปปปปปปป ปปปปป  ชชชชชˆˆˆˆˆ™™™™™™™™™™™€ˆˆˆˆˆˆˆˆˆˆ™™™™™ˆˆˆจชชชชช™™™™™ปปป‹ˆˆˆˆˆปปปซชชชชชˆˆˆˆˆ˜™™™™ปปปปปปปปปปปปฐปปปปฐปปปปชชชช €ˆˆˆˆ™™™™™™™™™ˆˆˆˆˆˆˆˆ™™™™™ˆˆˆˆชชชช ™™™™นปปป ˆˆˆˆธปปปซชชชชชˆˆˆˆˆ˜™™™™ปปปปปปปปปปปปปปป ปปป  ชชชˆˆˆ™™™ ™™™™ €ˆˆˆ€ˆˆˆ™™™™ €ˆˆˆ ชชช™™™ฐปปป€ˆˆˆปปป ชชชช €ˆˆˆˆ™™™™นปปปปปปปปฐปปปP-- title: Verlet solver -- author: Sava -- desc: 80-line interactable verlet solver -- version: 0.1 -- script: lua w=240 h=136 part = {} rad = 5 function BOOT() for i=1, 150 do local x = math.random()*(w-rad*2)+rad local y = math.random()*(h-rad*2)+rad part[#part+1] = {x=x, y=y, prevx=x, prevy=y, col=math.random(8, 11)} end trace("start") end function TIC() cls(0) local mx, my, left, middle, right = mouse() local nleft, nright = 0, 0 if left then nleft = 1 end if right then nright = 1 end update(mx, my, (-nleft+nright)) draw() end function update(mx, my, mf) for i=1, #part do local curPx, curPy = part[i].prevx, part[i].prevy part[i].prevx, part[i].prevy = part[i].x, part[i].y-0.1 part[i].x = part[i].x + (part[i].x-curPx) part[i].y = part[i].y + (part[i].y-curPy) if part[i].x < rad then part[i].x = rad end if part[i].x > w-rad then part[i].x = w-rad end if part[i].y < rad then part[i].y = rad end if part[i].y > h-rad then part[i].y = h-rad end for j=1, #part do collision(i, j) end local mdist = math.max(dist(part[i].x, part[i].y, mx, my), 0.001) local afX, afY = mf/mdist*(mx-part[i].x), mf/mdist*(my-part[i].y) part[i].x, part[i].y = part[i].x-afX, part[i].y-afY end end function collision(i, j) local dist1 = math.max(dist(part[i].x, part[i].y, part[j].x, part[j].y), 0.001) if dist1 < rad*2 then local dx, dy = part[j].x-part[i].x, part[j].y-part[i].y local ndx, ndy = dx/dist1, dy/dist1 local delta = rad*2 - dist1 part[i].x, part[i].y = part[i].x-(0.5*delta*ndx), part[i].y-(0.5*delta*ndy) part[j].x, part[j].y = part[j].x+(0.5*delta*ndx), part[j].y+(0.5*delta*ndy) end end function dist(x1, y1, x2, y2) return math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) end function draw() for i=1, #part do circ(part[i].x, part[i].y, rad, part[i].col) end end