Gå til innhold

et matematisk problem - rotasjon


Anbefalte innlegg

jeg trenger hjelp til noen beregninger som jeg har glemt hvordan man gjør det i forbindelse med rotasjon

det som jeg ønsker å gjøre er å rotere et område med mange punkter slik at de får en ny plasering

 

det jeg prøver å finne ut er hvordan man kan regne ut viklene ut fra seter i hele sirkelen

egentlig så gjelder det alle punktene i området

 

seter av område blir selvfølgelig halvparten av brede og høyden i område

eksempel

brede/høyde = 100

senter = 50

 

punktene kan være hvor som helst mellom 1 og 100.

 

dette skal gjøres med alle punktene innenfor området

her har jeg bare tat med 4 punkter

vinklene vi serfølgelig være alt fra 0° og hele veien rund tilbake til 0°( 360°)

 

så legger jeg til det antallet grader det skal rotereres med før jeg regner tilbake hvor det nye punktet skal plasseres ( x og y )

 

x og y ut fra senter er greit å regne ut men det som er problemet er vinkelen

 

hvor i all hverdan har valget får å laste ned et bilde tatt veiene ?

jeg får ikke forklart all før jeg finner dette valaget

tenk der følgenede.

jeg har definert et område

la oss si at det er på 100 punkter både horisontalt og vertikalt

da vil også senter være ved 50 punkter horisontalt og vertikalt.

jeg bruker x for horisontal akse og y for den vertikale

tenk dere et horisontal og vertikal akse gjenomm sirkelen

så tar men et vilkårig punkt

eksempel1. 1: x:=20;

y:=20;

x og y er før senter eller område øverst til venstre

men så ønsker jeg å finne vinkelen fra dette punktet til senter

avstanden blir etter litt beregning 30 for x og 30 for y

jeg prøvde med srt(powwer(x,2=+power(y,2) kvaderatt roten av x i 2 + y i 2 men får det ikke ti l å stemme helt - jeg er sikker helt på jorde. når jeg tenker etter så dette beregnig av radiusen

men hvordan var det man fant vinkelen

 

 

eksempel 2:

når x= 60 og y er 20 - x er på andre siden av senter eller øverst til høyre

eksempel 3

x=20 y= 65 - y er under senter nedre til venstre

eksempel 4

x=60 og y = 65 - begge er på den adre siden av senter eller nede til høyre

 

jeg vet at det skal gå ann å bruke funksjonenen "tan","sin" og "cos" men jeg har glemt hvordan

her er det beregninger i alle deler av sirkelen.

vil da ikke bergningen bli litt forskjelig av hengig i hvilken del man beregner

når beregningen med å finne vinkelen er rett så kan man bar legge til den vinkelen som det skal roteres

 

 

 

 

 

 

 

 

Endret av elg-elg123
Lenke til kommentar
Videoannonse
Annonse

jeg ser at jeg har vært klossete til å forklarer meg.

 

utgangspunktet er :

 

selv om det ikke er beregnet direkte til bbitmapbilde som består av mange punkter så kan det best forklares slik.

 

man har et bilde som f.eks består av 200 x 200 punkter.

bredde er 200 pixels

høyde er 200 pixels

dette haddeejeg tenkt å rotere om sin egen akse.

rotasjon skal være på henholdsvis 90°,180° og 270° ( -90°).

 

da må programmet jeg lager gå gjennom alle 40 000 punktene.

beregne vinkelen ut fra senter , beregne vinkelen på det

 

så må jeg legge til rotasjonen . beregne det nye punktet

 

 

tasle: jeg skal se om jeg kan bruke eksempelet

Endret av elg-elg123
Lenke til kommentar
hvordan kom du frem til disse to formlene.

 

Det er tradisjonell matriseregning for rotasjoner av et punkt i et kartesisk koordinatsystem, der man tenker seg en vektor v fra origo til punktet P. Man kan enten rotere hele koordinatsystemet, eller kun rotere vektoren (som må være like lang). Vektoren v har en gitt vinkel i forhold til x-aksen som start, og en ny vinkel etter rotasjonen av P. Så her kan du i grunnen bruke Pythagoras der du setter inn sinus og cosinus til vinklene i forhold til hypotenusen i stedet for lengdene av katetene, og beholder den samme lengden på hypotenusen (=vektor v).

 

Jeg gjorde et søk med Google, og fant fra til http://mathworld.wolfram.com/RotationMatrix.html. Illustrasjonene der skulle være greie nok som beskrivelse. Der er det også gjengitt en rotasjonsmatrise, som utregnet blir slik som i innlegget mitt ovenfor, når det gjelder en rotasjon mot klokka. En tilsvarende rotasjon medurs medfører stort sett bare bytte av fortegn i matriseutregningen. Med andre ord, ordinær lineær algebra.

Lenke til kommentar

For generelle bilde transformasjoner er det en fordel å bruke backward mapping (eller inverse mapping som det også heter) så slipper du anomalier som hull i det transformerte bildet når det nye transformerte bildet er større. Kan vel også være en fordel med interpolasjonsmetoder for å slipp hakkete kanter.

 

Rutinen for backward mapping er å ta for seg alle piksler i det nye bildet/skjermen (nyttbilde) og sjekke om de "mapper" til en piksel i det utransformerte (gammeltbilde).

 

for alle koordinater x',y' i nyttbilde gjør dette:
 x = round(cos(v)*x' + sin(v)*y')
 y = round(-sin(v)*x' + cos(v)*y')
 if (x,y) er inni gammeltbilde så:
nyttbilde(x',y') = gammeltbilde(x,y)
 else
nyttbilde(x',y') = 0; //Evt. ikke sett noen farge her for transparent oppførsel.
end for

 

Hvor v er rotasjons graden.

Lenke til kommentar

jeg hold på med rotering av bitmapbilder for en sund siden og hadde glemt hvorda man gjorde det .

jeg fant ikke tilbake til det programmet. der måtte nettopp beregne tilbake eller inverse om som du skriver for å unngå disse hullene.

nå beregnet jeg det på en litt annen måte da

 

denne gangen er det greit å bruke forslaget til Tasle siden det kun er snakk om vinkler på 90°,180° og 270°

Lenke til kommentar

horfor stemmer ikke bregningene her

punktet posisjonx , posisjony skal roteres 90° rundt senterx,sentery

 

her bruker jeg først et område som jeg har kalt vindu som består av 4 verdier ( vindufra og vinduslut både horisontalt og vertikalt ved x og y )

 

inni dette område har jeg definer et arbeidsområde ( omradestart.x,omradestart.y ,omradeslutt.x,omradeslutt.y)

 

 

jeg har beregnt de ralative vediene for omrade ( omradestar blir da satt til 0,0 og omrade slutt blir tilsvarende justert) og kalt dem for henholsvis rbredde og rhøyde

 

punktet mitt må ogsa justeres tilsvarende

 

jeg har også beregnet senter ved å dele høyde og bredde på 2

 

etter at punktet er juster 90 grader så må je flytte det tilbake til utgangspunktet

ved å legge til omradefra.

likevell sa blir det ikke rett

jeg har også prøvd med å legge til senter posisjonen uten at det hjalp.

 

hva er det som mangler

 

til dette har jeg brukt 10 spiedit kontroller ( 2 til å bestemme posisjon ,4 for å bestemme område og 4 for å bestemme vindu )

 

for at jeg skulle se resultate så har jeg brukt både stringgrid og paintbox

 

 

 

procedure TForm1.Button4Click(Sender: TObject);
var
rbredde,rhoyde:integer;
rposx,rposy:integer;
senterx,sentery:integer;
jposy,jposx:integer;
nyx,nyy:integer;
begin

	// test
paintbox2.Canvas.Brush.Color:=clwhite;
paintbox2.Canvas.pen.Color:=clred;
paintbox2.Canvas.Rectangle(0,0,vindusluttx.Value,vinduslutty.Value);
paintbox2.Canvas.Rectangle(omradestartx.Value,omradestarty.Value,omradesluttx.Value,omradeslutty.Value);

// reltivt  område
rbredde:=omradesluttx.Value-omradestartx.Value;
rhoyde:=omradeslutty.Value-omradestarty.Value;


stringgrid2.Cells[0,1]:='relative verdier';
stringgrid2.Cells[0,2]:='område';
stringgrid2.Cells[1,2]:=format('%d',[rbredde]);
stringgrid2.Cells[2,2]:=format('%d',[rhoyde]);
senterx:=rbredde div 2;
sentery:= rhoyde div 2;
stringgrid2.Cells[0,3]:='senter';
stringgrid2.Cells[1,3]:=format('%d',[senterx]);
stringgrid2.Cells[2,3]:=format('%d',[sentery]);

// test
paintbox2.Canvas.Pixels[posisjonx.Value,posisjony.Value]:=clblue;
rposx:=posisjonx.Value-omradestartx.Value;
rposy:=posisjony.Value-omradestarty.Value;

stringgrid2.Cells[0,4]:='posisjon';
stringgrid2.Cells[1,4]:=format('%d',[rposx]);
stringgrid2.Cells[2,4]:=format('%d',[rposy]);

// punkter mellom punkt og  senter
// juster runt 0-punkt /senter +/- senter
jposx:=senterx-rposx;
jposy:=sentery-rposy;

stringgrid2.Cells[0,5]:='justert pos';
stringgrid2.Cells[1,5]:=format('%d',[jposx]);
stringgrid2.Cells[2,5]:=format('%d',[jposy]);


stringgrid2.Cells[0,6]:='90°';
nyx:=round(jposx*cos(90*pi/180)-jposy*sin(90*pi/180));
nyy:=round(jposx*cos(90*pi/180)+jposy*sin(90*pi/180));


stringgrid2.Cells[0,6]:='90°';
stringgrid2.Cells[1,6]:=format('%d',[nyx]);
stringgrid2.Cells[2,6]:=format('%d',[nyy]);

nyx:=nyx+omradestartx.Value+senterx;
nyy:=nyy+omradestarty.Value+sentery;

stringgrid2.Cells[0,7]:='justert 90°';
stringgrid2.Cells[1,7]:=format('%d',[nyx]);
stringgrid2.Cells[2,7]:=format('%d',[nyy]);

paintbox2.Canvas.Pixels[nyx,nyy]:=cllime; // test

end;

Lenke til kommentar

det tror jeg nok det er for stort til siden det for tiden består av over 10 tusen program linjer.

(10 163 linjer)

 

men jeg kan beskrive det litt bedre.

 

urgangspunktet er at jeg ønsket å lage mine egen knapper i programmen som jeg lager .

 

derfor ha jeg gort det slik:

en knapp i Windows består egentlig av ett eller flere bilder ( gjerne bitmap)

så det programmet gjør eller skal gjøre er å lage disse bildene .

 

man kan bestemme hvor mage pixels bilde skal bestå av ( det har ingen ting med oppløsningen på skjermen)

bestemme hvor mange ruter dette består av ( kommer tilbake hva jeg mener med ruter)

og da kan også bestemme hvor mange pixels hver rute består av

 

grunne til at jeg bruker et rutenett er for å kunne justere størelsen uten gjøre alt på nytt.

i hver rute plasere man en objekt ( figur ) som enten er en trekant firkant elle en figur som er avrundet rundet runt et av hjørnene.

man kan faktisk plasere flere figurer i samme rute for å få til en spesiell virkning .

 

man kan også bestemme hvor mange ruter en figur skal dekke.

 

så har man mulighter til å forskyve inholdet i ruten både horisontalt og vertikalt.

man har også muligheter til å endre figurene i i rutene også etter at man har plassert dem der .

så ønsker jeg å gjøre det mulig å ender et område på flere ruter på en gang dog ikke alle

det når jeg skal rotere dette valgte område sliter litt

 

det som jeg la ut i forrige innlegg var en test får å prøve om rotasjonen virket

jeg skal prøve å fremstille det grafiske utseende med tegn

 

 

 

 

jeg kunne tenke meg en metode for å rotere det område som er markert med den brune rammen som fungerer

 

jeg har en annen løsning på denne rotasjonen også men den virker ikke like enkel.

Endret av elg-elg123
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...