[delphi] Coordinaten polariseren

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Inleiding
Ik ben bezig met een prog waarin tekst gerenderd moet worden. Eigenlijk kan het vanalles zijn dat uit een set coordinaten bestaat, maar tekst wordt er het meeste mee gerenderd.

Probleemstelling
Nu moet er een feature in komen, waarmee de tekst rond een cirkel gerenderd kan worden, net alsof je het op een CD labeltje wil printen dus. En ik hoorde dat dit "het polariseren van coordinaten" heet :)

Wat heb ik al
Nu heb ik al een frameworkje waarmee meerdere coordinaten-transformaties na elkaar kunnen worden uitgevoerd, waarbij de totale breedte en hoogte van het te renderen object bekend is en waar de X en Y in gestopt wordt, om de getransformeerde X en Y weer uit te poepen.

Mijn trigonometrische kennis is een beetje stoffig geworden de laatste paar jaar, maar wat eenvoudige formuletjes ken ik nog wel. Alleen polariseren gaat me ff de pet te boven ;)

Dit is geen "scriptrequest", maar meer: hoe pak ik dit aan? Welke formules zijn hierbij nodig of zijn er misschien al formules hiervoor gemaakt (hoeft dus geen delphi te zijn, mag ook gewoon wiskundige notatie zijn).

Alvast bedankt :)

日本!🎌


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 02:19

Reptile209

- gers -

Je wil dus van (X,Y) naar een (r, alfa) stelsel gaan. r is de straal vanuit het middelpunt, alfa is de hoek ten opzichte van de x-as. Daarvoor geldt (zo uit mijn hoofd):

r = (x2 + y2)0,5 (pythagoras)
tan(alfa) = y / x -> alfa = tan-1(y/x)

Afbeeldingslocatie: http://members.home.nl/digger/coordinaten.gif

Zoek in je ouwe wiskundeboek eens naar de eenheidscirkel.

Geen idee of dit is wat je nodig hebt, maar 't is goed bedoeld moet je maar denken :Y)

[ Voor 28% gewijzigd door Reptile209 op 14-06-2003 21:22 ]

Zo scherp als een voetbal!


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Je wilt gebruik maken van cirkelcoordinaten (Engels: polar coordinates, vandaar 'polaire coordinaten'). Daarbij geef je een coordinaat aan als een afstand r vanaf de oorsprong onder een hoek φ.
r = √(X2 + Y2)
tan(φ) = Y/X

Een goede grap mag vrienden kosten.


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Mja, de hoek en de afstand t.o.v. het middelpunt berekenen gaat nog wel, maar daar heb ik volgens mij weinig aan. ik heb eigenlijk een willekeurige set coordinaten die op de omtrek van een cirkel geprojecteerd moeten worden.

Dus zulk soort coordinaten:
code:
1
.  .  .  .  .


Moeten in zoiets omgezet worden:
code:
1
2
     .     ·     .
·                     ·


Beetje onduidelijke puntjes, maar ze staan er echt :)

/edit
Hmm, ik bedenk me net, die formules van jullie zou ik dus inverse moeten gebruiken en dan de X-as als hoek en de Y-as als straal opgeven. En dan kijken wat eruit komt...

[ Voor 18% gewijzigd door _Thanatos_ op 14-06-2003 21:55 ]

日本!🎌


  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 17:59

Knutselsmurf

LED's make things better

De punten (x,y) kunnen lineair getransformeerd worden naar een (r,alpha). Bijvoorbeeld (r,alpha)=2*y,3*x+75). Ik noem maar een paar getallen. Om deze (r,alpha) vervolgens netjes af te drukken, zul je ze weer om moeten rekenen naar een carthesisch (rechthoekig) stelsel. Op dat moment komen de sinus en cosinus om de hoek kijken. x=cos(alpha)*r en y1=sin(alpha)*r. Houd er dan wel rekening mee dat een heok van 0 graden 'op 3 uur' ligt en de hoek tegen de wijzers van de klok in oploopt. Afbeeldingslocatie: http://websmurfer.student.utwente.nl/Johan/wazig.gif
ABCD is oorspronkelijk een rechthoek, maar wordt door de lineaire transformatie naar polaire coordinaten en vervolgens de weergave op een carthesisch assenstelsel bovenstaand figuur

- This line is intentionally left blank -


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Ok, dat heb ik dus inmiddels voor mekaar. De coordinaten worden nu prima gepolariseerd en de tekst wordt dus als het ware om een cirkel gerenderd (wat het oorspronkelijke idee was). Tnx allemaal :)

En de code, voor de liefhebbers:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
function TCircleTransformer.Transform(var X, Y: Extended): Boolean;
var
   OurRadius, OurAngle: Extended;
begin
OurRadius := FRadius * FStepsPerMM + Height - Y - Top;
OurAngle := FAngle + X / FStepsPerMM - 
            Left - Width / FStepsPerMM / 2 - 90;
Y := Sin(DegToRad(OurAngle)) * OurRadius;
X := Cos(DegToRad(OurAngle)) * OurRadius;
Result := True;
end;


die "- 90" is dus omdat een hoek van 0 graden op "3 uur" ligt, aldus Knutselsmurf.

Nu alleen nog het probleem dat de tekst (of wat dan ook) breder wordt bij een grotere straal. Maar daar kom ik nu denk ik wel uit. Bovenstaande was eigenlijk het grootste probleem.

日本!🎌

Pagina: 1