Avatar billede folle Nybegynder
23. juli 2001 - 18:09 Der er 8 kommentarer og
1 løsning

Algoritme (tricky...)

Jeg søger en algoritme som givet en radius for en kugle i et 3 dimesionelt rum samt en afstand, beregner punkter fordelt over hele kuglens overflade med den pågældende afstand mellem punkterne.

(Problemet svarer til at bestemme positionerne af hjørner mellem felter på en fodbold.)

Håber der findes et matematisk geni som kan hjælpe...

-folle
Avatar billede roenving Novice
23. juli 2001 - 18:33 #1
Ja den er i hvert fald tricky;

men ...

hvis det skal komme til at du, skal du jo have et mønster -- OG en afstand som ender med at du \'kommer tilbage\' -- altså at det går op !~]
Avatar billede jvh Nybegynder
01. august 2001 - 09:21 #2
Her tror jeg sgu at jeg kan hjælpe. Jeg lavede for 1 års tid siden noget java der kunne noget i den retning. Desværre har jeg ikke koden ved hånden, men jeg kan give dig et godt forslag.

Det du i virkeligheden er ude på, er at tegne et landkort som dem der hænger på skolerne, og derefter projicere det på en kugle.

Landkort er jo en 2 dimensionel repræsentation (jeg er ikke matematiker, så undskyld hvis jeg vrøvler) af grader på en kugle (jordkloden), hvilket vi også kalder længde- og bredde-grader.

Hvis vi nu vedtager at du vil have N*M punkter på din kugle, så skal du definere n*m punkter a\' {længdegrad, breddegrad } disse kan du f.eks. definere i radianer, og så skal de altså ligge indenfor værdiområde [0 - 2*PI] (hvis jeg ikke husker meget forkert).

Du definerer altså ikke afstanden mellem punkterne i absolut tal, men i grader.

Når du har alle de her punkter liggende i gradtal, skal du have projiceret dem op på kuglen, og der bruger du følgende formel: (som jeg lige fandt på nettet til formålet - jeg håber den er korrekt :-) )

    x = distance * cos( latitude ) . sin( longitude )
    y = distance * sin( latitude )
    z = distance * cos( latitude ) . cos( longitude )

distance må radius på kuglen, latitude er breddegraden og longitude er længdegraden.

Eksempel:

radius = 2000
punkt i lgrad/bgrad : (0,2*pi)
projiceret: x = 2000 * cos(0) . sin(2*pi)
osv...

Bemærk at \".\" må betyde prik-produktet.
Avatar billede folle Nybegynder
04. august 2001 - 15:31 #3
Jeg bruger i øjeblikket noget der svarer til den metode du beskriver. Problemet er at der bliver en høj tæthed af punkter i toppen og bunden af kuglen, som på en glubus. Det jeg er ude efter er mere i stil med en fodbold, sat sammen af 5- og 6-kanter.
Avatar billede jakoba Nybegynder
08. august 2001 - 11:27 #4
Hvis vi siger at punkterne skal have samme afstand til \"nabopunkter\" har vi en simpel progression

1 punkt.            den trivielle.
2 punkter.          overfor hinanden
3 punkter.          placeret 120 grader fra hinanden på en storcirkel.
4 punkter.          placeret i en 3 kantet pyramide

og så er det slut. Der findes ikke flere konfigurationer af punkter på en kugle hvor alle punkter er lige langt fra hinanden.

mvh JakobA

Avatar billede jakoba Nybegynder
08. august 2001 - 11:59 #5
Det du vist er ude efter er \"regulære\" former der fordeler punkterne jævnt på kugleoverfladen. dem er der lidt flere af men ikke vældig mange.

Den fodbold du bruger som eksempel opfylder fx. heller ikke det krav.

Men vi kan sige lidt om dem.

1) De er alle lavet ved at gentage figurerne 2, 3 eller 4 ovenfor et antalgang med regelmæssige vinkler imellem. en 8-kantet terning kan fx laves ved at placere nr 2 3 gange vinkelret på hinanden.

2) De kan allesammen \'bygges\' af ligesidede 3, 4 eller 5 kanter:
  3 punkter = een ligesidet trekant                trekant
  4 punkter = fire ligesidede trekanter            trekantet pyramide
  6 punkter = otte ligesidede trekanter            8-kantet terning
  32 punkter = tres ligesidede trekanter          nærmest rund
  8 punkter = seks kvadrater                      almindelig terning
  20 punkter = tolv femkanter                      dodekaheder

Din fodbold er vistnok et modificeret dodekaheder

mvh JakobA


Avatar billede jakoba Nybegynder
09. august 2001 - 00:00 #6
Ups. linien
  32 punkter = tres ligesidede trekanter          nærmest rund
er gal. det skal være:
  12 punkter = tyve ligesidede trekanter          dodekaheder

og hvad den sidste (12 5-kanter) hedder ved jeg så ikke.
Avatar billede folle Nybegynder
09. august 2001 - 08:48 #7
Jeg ved godt at regnestykket ikke altid går op, så derfor behøver afstandende heller ikke at være 100% nøjagtige, bare så den grafiske repræsentation af kuglen kommer til at se uniform ud.

Undskyld hvis jeg har været lidt for uklar i mit spørgsmål.

-folle
Avatar billede jakoba Nybegynder
09. august 2001 - 17:50 #8
Det gør ikke noget.
Det væsentlige er at de 6 former er alle de helt regulære der er.
De kan så \'udvides lidt ved at man skiller fx femkanterne lidt fra hinanden og sætter firkanter ind der forbinder de kanter der før stødte sammen, og derefter nogler trekanter imellem firkanternes frie sider. det bliver en \'gennemsnitsform af \'20 3-kanter\' og \'12 5-kanter\' formene der er ganske stor.
Rigeligt detailleret nok til fodbolden. hvor blot en smule elasticitet i stoffet er nok til at gøre den perfekt rund.

hvor detailleret en opdeling af kugleoverflader har du brug for?

mvh JakobA
Avatar billede jakoba Nybegynder
12. august 2001 - 20:15 #9
Her er så en generel metode:
Den er dog mere empirisk end algoritmisk, men med kun 3 forsøg er den ikke helt dårlig:

Den er baseret på at en trekant kan opdeles i 4, 9, 16, ... mindre trekanter, ved at opdele siderne i 2, 3, 4, ... stykker og forbinde med linier paralelle med trekantens sider.

cut&paste eksemplet nedenfor ud i notepad ned skrifttype courier. eksperten.dk er ikke blivd ved bogstavgrafik :(
      a
    / \\
    /  \\
  /    \\
  /      \\
/        \\
b-----------c
del linierne i 2 med nye punkter d,e,f
      a
    / \\
    /  \\
  d    e
  /      \\
/        \\
b-----f-----c
tegn linier mellem de nye punkter
      a
    / \\
    /  \\
  d-----e
  / \\  / \\
/  \\ /  \\
b-----f-----c
og skub tilsidst punkterne ud så de ligger på kuglens overflade.
De trekanter der kommer ud af det bliver ikke helt ens. men tæt på.

og ved at vælge at starte med en af nedenstående figurer og så opdele siderne i i 2,3,4,... stykker kan du få en \'afstand\' der er rimeligt tæt på det ønskede.
  4 punkter = fire ligesidede trekanter            trekantet pyramide
  6 punkter = otte ligesidede trekanter            8-kantet terning
  12 punkter = tyve ligesidede trekanter          nærmest rund

mvh JakobA
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester