Hur beräknar man vilken pixel som är var på en bild?

Permalänk
Medlem

Hur beräknar man vilken pixel som är var på en bild?

Har tänkt ha en karta som bild där jag sen ska kunna rita ut linjer till vissa gradtal från mitten.

Så om vi leker med tanken att bilden är 800x600 pixel så är mitten 400,300.
Men om jag nu vill dra en linje från 400,300 i 120 graders vinkel (snedt ner åt höger) som är 100 pixel lång, hur vet jag vilken pixel jag ska avsluta linjen på?

Det är säkert jättelätt men jag kommer inte på hur jag ska göra beräkningen.

Edit:
Det jag är ute efter är alltså en formel där man stoppar in gradtalet och får ut X och Y kooordinaterna i bilden.
(eller två formler)

Permalänk
Medlem

Om jag inte är alltför trött nu på slutet av veckan så borde det bli nåt sånt här?

x = radien * cos(vinkel i grader)
y = radien * sin(vinkel i grader)

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av NoPaiN^:

Om jag inte är alltför trött nu på slutet av veckan så borde det bli nåt sånt här?

x = radien * cos(vinkel i grader)
y = radien * sin(vinkel i grader)

Nästan, glöm inte ursprungskoordinaten:

x_end = x_start + r*cos(θ)
y_end = y_start + r*sin(θ)

Edit: ett annat alternativ är att helt enkelt grafiskt kunna rita dina linjer, ger lite större frihet också:

m_down = ditt språk/librarys kod för mousedown-event
m_up = ditt språk/librarys kod för mouseup-event

i någon sorts pseudo-kod:

on m_down : start_coords=getCoords(); on m_up : end_coords=getCoords(); drawLine(start_coords, end_coords);

där koordinaterna anges i arrays

Visa signatur

Citera för svar!|Fraktfritt hos INET|Min hemsida
Fractal Design Define R3|Corsair AX 850W|Gigabyte Nvidia GeForce GTX 570|Corsair Vengeance 1600MHz 2x4GB|ASRock P67 Extreme4|Intel Core i5 2500K|2x Samsung Spinpoint F3 1TB|Samsung Blu-Ray läsare
Nikon D7000|Nikon 60mm macro|Nikon 18-70|Nikon 55-300|Nikon 10.5 Fisheye

Permalänk
Hedersmedlem
Skrivet av phroggyy:

Nästan, glöm inte ursprungskoordinaten:

x_end = x_center + r*cos(θ)
y_end = y_center + r*sin(θ)

Dessutom måste man bestämma hur koordinatsystemet ser ut (är y-axeln riktad uppåt till exempel?) och kompensera för att vinkeln definieras som den gör.

Permalänk
Medlem

Är inte intresserad av en klicka sig fram, bara en ren beräkning av kända värden.

Tack för hjälpen, det ser ut att stämma. Kollar på det i helgen kanske.

Permalänk
Medlem

Hmm... Det verkar som att vinklarna inte stämmer överens med så som jag tänker.

X=400+100cos(90)=400 // detta skulle jag vilja ha till 500 med tanke på att 90 grader rakt höger.
X=400+100cos(180)=300 // detta borde bli 400 då det är rakt ner.

Eller?

Permalänk
Medlem

^ 0 grader är rakt åt höger, 90 grader blir ju rakt uppåt.

Permalänk
Hedersmedlem

Du måste som sagt kompensera för att du räknar vinklar på det där sättet. "Normalt" är det där -30 grader; inte 120.

Dessutom måste du förmodligen konvertera vinkeln till radianer för att sin() och cos() skall bli rätt.

Permalänk
Medlem

Aj då.
Då blir det genast lite jobbigare..

Inte bara att det är fel vinkel utan också på fel håll.
Men problem ät till för att lösas.

Tack!

Permalänk
99:e percentilen

Kan tipsa om enhetscirkeln. Den kan vara till stor hjälp vid sådana här problem, om man inte råkar vara så duktig på matematik att man förstår allting ändå.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

Kan tipsa om enhetscirkeln. Den kan vara till stor hjälp vid sådana här problem, om man inte råkar vara så duktig på matematik att man förstår allting ändå.

Tack!

Kunde inte se någon lösning på hur jag ändrar vinkeln från 120 till -30 osv.
Men ska kolla på länken bättre imorgon på datorn.

Annars tänkte jag lösa det genom två arrayer.
Den ena har "mina" gradtal och den andra har sin/cos gradtal och sen bara jämföra rakt i koden.
Gradtalen anges bara i hela tiotal så det blir bara 36 värden, så det är överkomligt.

Permalänk
Hedersmedlem
Skrivet av Agonotheta:

Tack!

Kunde inte se någon lösning på hur jag ändrar vinkeln från 120 till -30 osv.
Men ska kolla på länken bättre imorgon på datorn.

Annars tänkte jag lösa det genom två arrayer.
Den ena har "mina" gradtal och den andra har sin/cos gradtal och sen bara jämföra rakt i koden.
Gradtalen anges bara i hela tiotal så det blir bara 36 värden, så det är överkomligt.

Äh, så besvärligt är det inte. För att byta riktning känns det rimligt att införa ett minustecken och sedan behöver man bara rotera en smula. Man vet också att

  • 0 skall bli 90

  • 90 skall bli 0

  • 120 skall bli -30

Antag y = -x + A
90 = -0 + A => A = 90
0 = -90 + A => A = 90 (än så länge lovande)
-30 = -120 + A => A = 90 (tur)

Den "vanliga" vinkeln ges alltså av din 90 grader minus din vinkel.

Permalänk
99:e percentilen
Skrivet av Agonotheta:

Tack!

Kunde inte se någon lösning på hur jag ändrar vinkeln från 120 till -30 osv.
Men ska kolla på länken bättre imorgon på datorn.

Du behöver inte göra om den till just –30° utan du kan lika gärna göra om den till 330°, ty –30° = –30° + 360° = 330°. (Man kan alltid lägga till 360° på en vinkel och få samma vinkel, för man "går bara ett varv runt".) Funktionen du vill skriva är:

f(v) = (v + 210) mod 360

Moduloberäkningen är egentligen inte nödvändig, ty cos 90° = cos (90 + 360)° = cos (90 + 2×360)° …, men det kan göra värdet som kommer ur funktionen lite mer begripligt.

I JavaScript:

function f(v) { return (v + 210) % 360; }

… eller C:

int f(int v) { return (v + 210) % 360; }

Citat:

Annars tänkte jag lösa det genom två arrayer.
Den ena har "mina" gradtal och den andra har sin/cos gradtal och sen bara jämföra rakt i koden.
Gradtalen anges bara i hela tiotal så det blir bara 36 värden, så det är överkomligt.

Jag kan tyvärr inte säga något annat än att det är en väldigt dålig lösning.

Visa signatur

Skrivet med hjälp av Better SweClockers