- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Samsung Galaxy Tab S10 Ultra - más dimenzió
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Canon EOS DSLR topic
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Forrmell.enn
- Vélemény: nem úgy tűnik, de Lip-Bu Tan most menti meg az Intelt
- AMD Navi Radeon™ RX 5xxx sorozat
- HiFi műszaki szemmel - sztereó hangrendszerek
- Hobby elektronika
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] -
-
[Kovi]
tag
válasz
Pizzafutar #19 üzenetére
Igen eddig én is eljutottam, hogy a két kör középpontját összekötöm és arra merőleges az érintő, és le is rajzoltam, csak ugye itt az érintő nem csak vízszintes / függőleges lehet mint a fal, szal így már nem csak egyet kell módosítani a két komponens közül hanem mind2-t, és ezt most így sajnos nem tudom matematikailag leírni..
-
[Kovi]
tag
Hát segítséget megköszönném.. igazából engem sebeség annyira nem zavar.. ezt a kis progit még elbírja AthlonXP :)) Meg nekem igazából csak egyetemen kéne bemutatnom ezt a progit. Fizikai hatások, szal tehetetlenség / gravitáció ilyesmi nekem nem kell csak simán az ütközés.. így gondolom azért valamivel egyszerűbb. Mert most berakok még egy kört akkor ott is tudom vizsgálni hogy azok befoglaló négyzetének koordinátái mikor egyeznek (szal ütközik a 2 labda), csak utána ugye nemtudom hogy hogyan kéne kiszámolni a szöget amiben tovább halad, mert ugye ez függ az irányoktól amikben haladnak a albdák az ütközés előtt, és ugye attól is hogy egymáshoz képest milyen pozícióben vannak mikor ütköznek. Én eltekintek olyasmitől hogy egyik labda esetleg nehezebb mint a másik, vagy hogy a sebességük és az ezekből adódó lenületük eltérő.. a 2 labda nálam teljesen azonos..
-
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! -
[Kovi]
tag
up!
#14ben felvetett 2 labdás problémára vmi 5let?
Szerk: nemszóltam.. látom közben jött válasz..
[Szerkesztve] -
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. -
[Kovi]
tag
válasz
BlackWoOd #13 üzenetére
Köszi a tippet, így is biztos jó lenne, de asszem nem éri meg átírni, főleg hogy azért enyém sem bonyolultabb, max az a 2 sor ami számolja a következő koordinátát.. de határ ellenőrzés ugyan úgy kell mind2 esetben.. most meg hogy már az én megoldásommal is tökéletesen megy :C
Szerk: Viszont ha van vmi hasonlóan egyszerű megoldásod arra amit #14-ben írtam.. azt szívesen fogadom :))
[Szerkesztve] -
[Kovi]
tag
válasz
Pizzafutar #11 üzenetére
Köszi a tippet, double-re átírva tökéletesen megy.. nemtudom, hogy nem vettem észre, pedig már régebben is többször szívtam ilyen double <-> int konverzióknál történő levágásos kerekítés miatt. Viszont akkor lenne még egy kérdése.. igaz ezzel még nem is próbálkoztam, csak úgy eszembe jutott, hogy ha beraknék még egy labdát akkor azt is el kéne intézni hogy ha a két labda ütközik akkor mi történjen.. nah mostugye ez már nem olyan egyszerű, mert itt akkor arra is figyelni kell hogy egymáshoz képest hogyan helyezkednek el a labdák, és akkor a szög is változik amiben tovább haladnak.. szal a matematikai alapok érdekelnének, ha le tudnád írni, hogyan kell az ilyet elméletben megoldani..
-
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! :) -
[Kovi]
tag
válasz
Pizzafutar #11 üzenetére
én is szögfügvényekre gyanakodtam, de én előjelezés miatt, viszont ugye 30 és 31 vagy 60 és 61 fok ugyan abba a tartományba esik + / - szempontjából, mármint ha sin / cos - ukat nézzük.. de így már tényleg ok szal a kerekítés.. minnyá megpróbálom double-ra átírni..
-
Pizzafutar
aktív tag
válasz
Pizzafutar #10 üzenetére
Mivel cos(61) < 0.5, ezert it mx eretke nem valtozik.
ezek utan a 4. if mindig vegrehajtodik!
lasd:
int t = m_ex*m_vx*(cos(m_alfa*pi/180));
m_x=m_x2+ t;
itt t mindig 0 marad.
Megoldas: vagy atirod a valtozokat double -ra, vagy hasznalsz valamilyen kerekitest, flor es tarsai! -
[Kovi]
tag
Persze de az a lényeg hogy lehessen állítani kiindulási szöget, és falról is ugyan abban a szögben pattanjon vissz. És moszgáshoz meg ki kell gonolnod hogy mi az adott úthoz tartozó következő lépés, vagyis melyik az az (x,y) érték ahova tovább kell mozgatnod.. De ha a te megoldásod működik így is, akkor írd le plíz engem érdekel..
-
[Kovi]
tag
válasz
Pizzafutar #6 üzenetére
Van hozzá builder-ed, szal le tudod futtatni, vagy töltsem fel .exe-t is?
-
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... -
[Kovi]
tag
Nah feltöltöttem extrára.. tömörítve csak 25K
[L]http://www.extra.hu/dirtyreading/labda.zip[/L]
Extra lehet sírni fog hogy kívülről nem elérhető, de adni fog egy linket és akkor onnan már le lehet szedni..
Amúgy 6.0-s MS Visual C++ os project ként van mentve ha ez számít valamit..
[Szerkesztve] -
[Kovi]
tag
válasz
Pizzafutar #2 üzenetére
Hát alapból asszem minden int -nek deklarált változót signed-nak vesz.. meg azért is furcsa lenne mert sin / cos függvények ugyan abban a tartományban vannak 31 fokra, mint pl 30-ra.. és 31 foknál még megy rendesen, 30-nál pedig már kirepül fölül.. De lehet fel tudom tölteni forrást vhova..
-
[Kovi]
tag
Szóval kéne írnom egy progit C++ -ban ami kirak egy ablakot és abban rajzol egy négyzetet, amiben egy labda pattog, úgy hogy a falról rendesen visszapattan meg minden. Meg is írtam a progit, csak ugye átdolgoztam hogy állítható legyen a kezdés helye pixelben (szal ahonnan indul a labda), illetve a szög amiben elindul a labda. És itt jön a progbléma.. Vannak bizonyos szögtartományok amiknél a labda kilép a baloldali illetve a felső kereten. 4 ilyen szögtartomány 4*60 fok szal összesen 240 fok. A maradék 120 fokban megy rendesen, de így ugye 2szer akkora az a tartomány ahol nem jó, mint ahol jó, és nem látom a megoldást. A lebda mozgását így oldottam meg:
m_vy++;
m_vx++;
m_x=m_x2+m_ex*m_vx*(cos(m_alfa*pi/180));
m_y=m_y2+m_ey*m_vy*(sin(m_alfa*pi/180));
dc.Ellipse(m_x-10,m_y-10,m_x+10,m_y+10);
if (m_y<Ys+12) {m_ey*=-1; m_y2=m_y; m_vy=1;}
if (m_x>Xs+Xh-12) {m_ex*=-1; m_x2=m_x; m_vx=1;}
if (m_y>Ys+Yh-12) {m_ey*=-1; m_y2=m_y; m_vy=1;}
if (m_x<Xs+12) {m_ex*=-1; m_x2=m_x; m_vx=1;}
Ahol m_x2 / m_y2 a kiindulási pont ahonann elindul a labda, ezeket egy edit boxból kéri be. az m_vx, és m_vy x és y irányú komponensek, tulajdonképpen csak szorzók amikkel a következő pontot számolja. m_alfa pedig a szög, de cos, sin függvények radiánban kérik ezért kell m_alfa*pi/180. m_ex, m_ey, pedig csak előjel szorzók, alapból 1 az értékük, így tulképpen ütközés után csak a mozgás valamelyik irányú komponensének előjelét fordítják. mivel csak felül és baloldalt lép ki, az 1. és az utolsó feltételben lehet a hiba csak nemtudom hogy mi. Fontos lenne, mert hétfőre le kéne adnom a progit egyetemen, szal segítsetek plíz!
Szerk: jah ami kimaradt: Ys, Xs, a négyzet bal felső sarkának koordinátái amiben pattog(na) a labda. Xh, Yh, pedig a négyzet adott irányú hosszúsága..
[Szerkesztve]
Aktív témák
Hirdetés
- SZÉP Lenovo ThinkPad P15 G2 Tervező Laptop -75% 15,6" i9-11950H 64/2TB RTX A4000 8GB UHD OLED
- Szép! Lenovo Thinkpad T14s G2 Üzleti "Golyóálló" Laptop 14" -50% i7-1185G7 4Mag 16GB/512GB FHD IPS
- Eladó Apple MacBook Pro 13" A1706 (Late 2017, Silver - EMC 3163)
- Amazfit GTR 2 Classic okosóra dobozában töltőkábellel
- Mac mini M1 chip 8 magos CPU-val, 8 magos GPU-val
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 16/32/64GB RAM RTX 4060Ti 8GB GAMER PC termékbeszámítással
- Bomba ár! HP Elitebook 8560W - i7-2GEN I 8GB I 500GB I 15,6" FHD I Nvidia I W10 I Garancia
- Asus ROG G20AJ - Intel Core i7-4790, GTX 980
- Ikea Eilif Paraván - Asztali elválasztó
- Honor Magic 7 Lite 256GB Kártyafüggetlen 1Év Garanciával
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest