Hejsan igen :) 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. 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. Eftersom det finns oändligt många punkter på en linje kan du knappast räkna ut allihop... =) 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.Linje funktion
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! Sv: Linje funktion
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.Sv:Linje funktion
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 :)Sv: Linje funktion
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...)Sv:Linje funktion
Tack för din hjälp Niklas :)