Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 7*7. Virtual rästel: Malstunde.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
22.09.2003, 11:27 Uhr
virtual
Sexiest Bit alive
(Operator)


Folgende Routinen funktionieren oft, aber nicht immer:

C++:
#include <iostream>

void clear_screen(std::ostream& out)
{
    out<<"\x1b[2J"<<std::flush;
}

void set_point(std::ostream& out, unsigned x, unsigned y)
{
    out<<"\x1b["<<x<<";"<<y<<"HX"<<std::flush;
}


Schreibe, insbes. mit Hilf von set_point ein Consolenprogram, welches Linien zeichnet. Das Programm erwartet als parameter die Koordinaten von Anfangs und Endpunkt der Linie:

C++:
draw_line x1 y1 x2 y2


So daß draw_line 1 1 10 5 zB ausgeben sollte ("_" durch Leezeichen setzen):

Code:
XX________
__XX______
____XX____
______XX__
________XX


Tip: Jack Bresenham Hat da einen netten Algo entwickelt, um Linien zu zeichnen...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 22.09.2003 um 11:28 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.09.2003, 14:12 Uhr
0xdeadbeef
Gott
(Operator)



C++:
void draw_line(std::ostream &out, int x1, int y1, int x2, int y2) {
  if(x1 == x2 && y1 == y2)
    set_point(out, x1, y1);
  else {
    double
      dx = double(x2 - x1) / std::max(std::abs(x2 - x1), std::abs(y2 - y1)),
      dy = double(y2 - y1) / std::max(std::abs(x2 - x1), std::abs(y2 - y1)),
      rx = x1,
      ry = y1;

    while(unsigned(rx + .5) !=  x2 || unsigned(ry + .5) != y2) {
      set_point(out, unsigned(rx + .5), unsigned(ry + .5));
      rx += dx;
      ry += dy;
    }
    set_point(out, x2, y2);
  }
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.09.2003, 14:17 Uhr
kronos
Quotenfisch
(Operator)


ist das ein golfrätsel?

ansonsten hier mal ein (ungetester) ansatz:

C++:
main(int args,char**arg)
{
int x1,y1,x2,y2;
scanf(arg[1],"%i",x1);
scanf(arg[2],"%i",y1);
scanf(arg[3],"%i",x2);
scanf(arg[4],"%i",y1);

if(x1==x2) {
for(;y1!=y2;y1<y2?y1++:y1--)
set_point(out, x1,y1);
} else {
int m=(y2-y1)/(x2-x1);
for (;x1!=x2;x1<x2?x1++:x1--)
set_point(out, x1, y1+x1*m);
}}

--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 22.09.2003 um 14:19 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.09.2003, 15:59 Uhr
virtual
Sexiest Bit alive
(Operator)


@kronos
Hängt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.09.2003, 16:03 Uhr
virtual
Sexiest Bit alive
(Operator)


@kronos
Hängt vermutlich an den scanfs

@beefy
Auchnicht besser: Endlosschleife + falsche Ausgabe.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.09.2003, 17:37 Uhr
0xdeadbeef
Gott
(Operator)


Bei mir läufts. Welche Werte hast du ihm mitgegeben? Ich hab als test-main simplerweise

C++:
int main()
{
  clear_screen(std::cout);
  draw_line(std::cout, 0, 0, 10, 20);
}


benutzt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.09.2003 um 17:44 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.09.2003, 18:26 Uhr
virtual
Sexiest Bit alive
(Operator)


1 1 10 5
Ausgabe dann: alle X in einer Zeile, gaaanz viele und am Ende Flackert ein X, als würde da dauernd irgendwas passiert.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.09.2003, 18:30 Uhr
0xdeadbeef
Gott
(Operator)


Bei mir ist die Ausgabe dann

Code:
X
X
_X
_X
__X
__X
___X
___X
____X
____X


Zeig mal dein main her.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 22.09.2003 um 18:31 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.09.2003, 19:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich bin leider nicht mehr im gleichen Netz, wo ich es Probiert hatte. Da main hatte ich voin Post 002 übernommen, die scanf's sinnvoll angepasst und zu sscanf gemacht. Und dannch aufgerufen draw_line(x1, y1, x2, y2);
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.09.2003, 19:23 Uhr
0xdeadbeef
Gott
(Operator)


Also, mein Programm sieht jetzt so aus:

C++:
#include <iostream>
#include <sstream>

void clear_screen(std::ostream& out)
{
    out<<"\x1b[2J"<<std::flush;
}

void set_point(std::ostream& out, unsigned x, unsigned y)
{
    out<<"\x1b["<<x<<";"<<y<<"HX"<<std::flush;
}

void draw_line(std::ostream &out, int x1, int y1, int x2, int y2) {
  if(x1 == x2 && y1 == y2)
    set_point(out, x1, y1);
  else {
    double
      dx = double(x2 - x1) / std::max(std::abs(x2 - x1), std::abs(y2 - y1)),
      dy = double(y2 - y1) / std::max(std::abs(x2 - x1), std::abs(y2 - y1)),
      rx = x1,
      ry = y1;

    while(unsigned(rx + .5) !=  x2 || unsigned(ry + .5) != y2) {
      set_point(out, unsigned(rx + .5), unsigned(ry + .5));
      rx += dx;
      ry += dy;
    }
    set_point(out, x2, y2);
  }
}

int main(int argc, char *argv[]) {
  int a, b, c, d;

  sscanf(argv[1], "%d", &a);
  sscanf(argv[2], "%d", &b);
  sscanf(argv[3], "%d", &c);
  sscanf(argv[4], "%d", &d);

  clear_screen(std::cout);
  draw_line(std::cout, a, b, c, d);
}


und läuft einwandfrei.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: