- Xiaomi Redmi Note 4 - B20
- iPhone topik
- Samsung Galaxy A56 - megbízható középszerűség
- Még egy Reno15 érkezett
- Itthon is elérhető a OnePlus 11 és a Buds Pro 2
- Telekom mobilszolgáltatások
- Hivatalos a OnePlus 13 startdátuma
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- iOS alkalmazások
- Honor Magic6 Pro - kör közepén számok
Aktív témák
-
BaLinux
tag
Hát mondjuk ha csak kettő labdád van, akkor:
ütköznek <==> (labda1.x-labda2.x)^2+(labda1.y-labda2.y)^2 <= (labda1.r+labda2.r)^2
az ütközés kimenetele pedig a fenti egyenlőtlenség teljesülése esetén így számolható:
- van a két labda, L1 és L2, és ismertek a koordinátáik: (.x; .y)=P, sebességkomponenseik: (.vx; .vy)=V, és sugaruk: .r.
Az ütközési normálvektor: N=(L1.P-L2.P)/abs(L1.P-L2.P) (tehát normalizálom, 1 hosszú vektor az N, és az egyik kör közepébe mutat, -N meg a másik közepébe)
Ezután transzformálod a két sebességvektort az N-nel párhuzamos és merőleges komponenssű vektorrá:
L.V_N=(N.x*L.V.x+N.y*L.V.y ; -N.y*L.V.x+N.x*L.V.y)
(mindkettőre igaz) => az L1.V_N és L2.V_N vektorok ''x'' összetevője tehát most a normális irányú sebességük, ''y'' összetevője meg az erre merőleges sebességük.
Az egészet azért csináltuk, mert csak az ún. centrális sebességük változik az ütközéskör.
Fgv. táblázatból:
L1.U_N.x=((1+k)*(L1.m*L1.V_N.x + L2.m*L2.V_N.x)/(L1.m+L2.m) - k*L1.V_N)
L2.U_N.x=((1+k)*(L1.m*L1.V_N.x + L2.m*L2.V_N.x)/(L1.m+L2.m) - k*L2.V_N)
illetve
L1.U_N.y=L1.V_N.y
L2.U_N.y=L2.V_N.y
(ez maradt meg)
,
ahol az U_N vektor az új, ütközés utáni sebességvektor. Ja, itt van egy Lx.m, ami a tömegük (tőlem lehet 1 is...), k pedig az ütközési rugalmasság. (tőlem legyen 1)
Ezt most nyilván visszafelé is transzformálni kell a ''normál'' koorinátarendszerbe, tehát
L.U=(N.x*L.U_N.x-N.y*L.U_N.y ; N.y*L.U_N.x+N.x*L.U_N.y)
mindkét labdára.
Így a végső sebességeik tehát L1.U, L2.U.
Remélem érthető és nem b*sztam el valahol egy előjelet. :DD
(ezt a progim általánosabb függvényének spec paraméterezése)
[Szerkesztve] -
-
Pizzafutar
aktív tag
Hmmm, ertem mire gondolsz.
Van 2 kor. Amikor utkoznek, a kulso pontjaik erinkeznek. Az erinto ekkor merroleges a pontok kozepet osszekoto egyenessel. Ugyanakkor a van mindegyik kornek egy-egy iranyvektora, amerre a korok mozognak. Ilyenkor ezeket az iranyvektorokat kell tukrozni az erintore. (ennek a specialis esete az eredeti peldaban a fal, ami 0 vagy 90 fokos erintonek felel meg.)
Ha lerajzolod, azthiszem ertheto! -
BaLinux
tag
De jó látni hogy van még rajtam kívül ember aki az ilyen szimulációkat szereti :)
A több labdás probléma már egy komoly dolog. Tavaly írtam egy 2d-s fizikai szimulátort c++-ban, ami támogatja a kör és poligon (konkáv is!) alapú ütközést. Egy lassan készülő kis játék fizikai motorja lesz amúgy. 2-3 hétig agyaltam rajta szüntelenül, összesen 77k kód.
A kör alapú, ami neked kell, még nem olyan bonyi, mert egyszerűen meghatározható minden labda-párra az az idő, amikor a jövőben adott aktuális sebességükkel ütközni fognak. A poligonos viszont már bonyolult, és pontatlan is, de azért működik.
Az ütközés számításához kell egy kis fizika (pl. én figyelembe veszem a tömeget, tehetetlenségi nyomatékot és rugalmasságot is).
Az ütközés csak abból áll, hogy az abban résztvevő objektumok sebessége megváltozik az adott összefüggések alapján.
A #13 hozzászólást intéző kollega által javasolt módszerrel kellene továbbvinni a programod, mert a tiéd a cos/sin miatt lassú, viszont közel ugyanolyan pontatlan, tehát nem sok előnye van.
Ha érdekel, szívesen segítek. -
BlackWoOd
aktív tag
Az én megoldásom a tiédtől alapvetően eltérne, de elvileg szögtartó pattogást alapból tartja, a szöget pedig az szintén képes tartani (igaz, nem teljesen pontosan, de neked is kerekítened kell...).
Az elv alapja, hogy kirakod a ''labdát'' a kezdő pozíciójába.
(mondjuk labdaX,labdaY koordinátákra)
Felveszel iránymódosító változókat (pl. deltaX, deltaY), amik meghatározzák a labda kövezkező mozgásának irányát (pl. deltaX = 1, deltaY = 1.5 esetén a labda balra lefelé mozog, lefelé 1.5-ször gyorsabban mint balra, stb.)
Minden körben lemódosítod a labdaX és labdaY-t a deltaX és deltaY-nal,
majd jönnek az ütközésvizsgáló if-ek.
Ha a labdaX vagy a labdaY kiesik valamelyik határon, csak a megfelelő deltaX előjelét módosítod, valamint ha pontosan akarsz dolgozni, a labdaX illetve labdaY értékét módosítod azzal az értékkel, amivel labdaX kijjebb esett a határon.
(Nem olyan bonyi, mint első olvasásra! :P )
De látom, már megoldódik a problémád! :) -
BlackWoOd
aktív tag
Hú, nem bonyolítottad ezt egy kicsit túl?
Elvégre négyszög alakú területen belül pattog a labda, nem is kell cos/sin függvény, csak sima függőleges és vízszintes határvizsgálat (2-2 db if), szerintem.
Elég csak azt nézned, hogy elérte-e a labda megfelelő koordinátája a határ értékeket és akkor kell mozgásirányt fordítanod...
Aktív témák
- Apple iPhone 17 Pro Max 256 GB Deep Blue - Bontatlan - HIVATALOS európai Apple viszonteladótól!
- Philips Hue Gradient Lightstrip hibás
- Killer 1650x Intel AXN 200NGW
- BONTATLAN Új iPhone 17 PRO 256-512GGB Független 1év Apple GARANCIA Deák Térnél Azonnal Átvehető.
- BONTATLAN Új iPhone 17 PRO MAX 256-512GGB Független 1év Apple GARANCIA Deák Térnél Azonnal Átvehető.
- Dell Vostro 3425 6magos Ryzen 5 5625U 8GB RAM 256GB SSD
- GYÖNYÖRŰ iPhone 12 Mini 128GB Black-1 ÉV GARANCIA -Kártyafüggetlen, MS4206, 100% Akksi
- Bomba ár! Dell Latitude 3340 - i3-4GEN I 4GB I 500GB I 13,3" HD I HDMI I Cam I W10 I Garancia!
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Keresünk Galaxy S22/S22+/S22 Ultra
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: BroadBit Hungary Kft.
Város: Budakeszi


