Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Linje funktion

Postades av 2008-12-05 17:05:56 - Fredrik Olofsson, i forum c++, Tråden har 4 Kommentarer och lästs av 1294 personer

Hejsan igen :)
Jag har gjort 2 st funktion nedan som ritar en linje mellan 2 st punkter. Det jag undrar över är varför det blir fel i den första funktionen om b.GetX() är mindre än a.GetX()? Jag ser inte felet nämligen. Jag byter ju plats mellan dem om det råkar vara så. Förutom detta så undrar jag om någon har någon ide hur jag kan göra så att linjen inte blir mer och mer osynlig när den när x närmar sig 0. Kan ju minska x värdet, men då blir mycket långsammare. För den andra funktionen så undrar jag om det är en bättre lösning än den jag försöker åstadkomma med den funktion 1.

Funktion 1:
<code>
void DrawLine(const Point & a, const Point & b, sf::RenderWindow & window, const sf::Color & color)
{
if(a == b)
{
return;
}
Point max = b;
Point min = a;
if(max.GetX() < min.GetX())
{
return DrawLine(max,min, window, color);
}
float x = max.GetX()-min.GetX();

float k = (max.GetY()-min.GetY())/(x);

std::cout << "K = " << k << std::endl;
sf::Image pixel(1,1,color);
sf::Sprite sprite(pixel);
sprite.SetPosition(min.GetX(),min.GetY());
window.Draw(sprite);
for(float x = 1; x <= (max.GetX()-min.GetX()); x++)
{
sprite.SetPosition(x+min.GetX(),x*k+min.GetX());
window.Draw(sprite);
}
sprite.SetPosition(max.GetX(),max.GetY());
window.Draw(sprite);
}
</code>

Funktion 2:
<code>
void DrawLine(const Point & a, const Point & b, sf::RenderWindow & window, const sf::Color & color)
{
if(a == b)
{
return;
}
Point max = (a.GetX() < b.GetX()) ? b : a;
Point min = (a.GetX() < b.GetX()) ? a : b;

bool shift = true;
if(min.GetY() > max.GetY())
{
shift = false;
}

float hypo = sqrt(pow(max.GetX() - min.GetX(),2) + pow(max.GetY() - min.GetY(),2));

double framex = (max.GetX() - min.GetX())/hypo;
double framey = (max.GetY() - min.GetY())/hypo;

sf::Image pixel(1,1,color);
sf::Sprite sprite(pixel);

if(shift)
{
for(float x = min.GetX(), y = min.GetY(); x<=max.GetX() || y<=max.GetY();)
{
if(x >= max.GetX() && y >= max.GetY())
{
break;
}
if(x <= max.GetX())
{
x += framex;
}
if(y <= max.GetY())
{
y += framey;
}
sprite.SetPosition(x,y);
window.Draw(sprite);
}
}
else
{
for(float x = max.GetX(), y = max.GetY(); x>=min.GetX() || y<=min.GetY();)
{
if(x <= min.GetX() && y >= min.GetY())
{
break;
}
if(x >= min.GetX())
{
x -= framex;
}
if(y <= min.GetY())
{
y -= framey;
}
sprite.SetPosition(x,y);
window.Draw(sprite);
}
}
sprite.SetPosition(max.GetX(),max.GetY());
window.Draw(sprite);
}
</code>

Tack på förhand!


Svara

Sv: Linje funktion

Postades av 2008-12-06 12:23:10 - Niklas Jansson

För det första: Finns det ingen inbyggd linjeritarfunktion? Om det gör det är det förstås den du ska använda, om det inte är för att lära dig.

För det andra: Den klassiska linjeritarfunktionen är "bresenhams algoritm". Den gör i princip det du gör i första funktionen, men den ritar på ett annat sätt om lutningen >1 (vilket är det du upplever när "den blir osynlig").

Den kan vara så att du har något mer snarlikt i den andra, men sök på bresenham bara, så löser det sig nog...

Sen känns det väldigt fel att göra en 1x1-sprite. Går det inte att rita pixlar bara?


Vidare så får du ingen anti-aliasing om du gör så här. Det absolut lättaste sättet att skaffa det är att göra en större bild (säg en längdskala på 1:n), och rita ut strecket med en viss bredd (som då blir samma bredd*n), och sen sampla ner den större bilden.


Svara

Sv:Linje funktion

Postades av 2008-12-06 15:27:10 - Fredrik Olofsson

Såklart finns det en inbyggd linjeritarfunktion, men den främsta orsaken varför jag skapade dessa funktioner från början var att räkna ut alla punkter mellan 2 punkter som jag sedan skulle använda i min Surface klass :) Men det var också för att lära mig.


Som jag vet så måste jag skapa en 1x1 sprite eller en shape eller något liknande då själva fönstret har inte någon SetPixel(x,y,färg) funktion som jag känner, men förstås, jag behöver inte skapa en sf::Image :)

Okej, tack jag ska kolla upp det :)



Svara

Sv: Linje funktion

Postades av 2008-12-07 14:11:56 - Niklas Jansson

Eftersom det finns oändligt många punkter på en linje kan du knappast räkna ut allihop... =)

Har man en sån lösning kan man nästan garantera att den inte alltid fungerar. (Den kan funka ibland, men då är det ren tur...)


Svara

Sv:Linje funktion

Postades av 2008-12-08 22:04:24 - Fredrik Olofsson

Jag förstod det när jag läste ditt andra svar i min andra tråd .. :P Jag ska göra det mesta när jag väl får tid till det.

Tack för din hjälp Niklas :)


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 872
27 965
271 770
471
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies