TwojePC.pl © 2001 - 2024
|
|
A R C H I W A L N A W I A D O M O Ś Ć |
|
|
|
[algorytm] Jak byście napisali algorytm łączenia dwóch punktów na płaszczyźnie? , kubazzz 3/06/09 13:53 Mamy płaszczyznę ograniczoną XY [X=Y], współrzędne od 1 do 100.
Dostajemy współrzędne dwóch punktów początkowego i końcowego i mamy wyznaczyć współrzędne wszystkich punktów łączących najkrótszą drogą punkt początkowy i końcowy. [czyli de facto musi to być odcinek, punkty mogą być po skosie, czyli z (x1,y1) od razu na (x1+1, y1+1) ]
Wydawało mi się to prostsze :)SM-S908 - Byly na to algorytmy , pachura 3/06/09 14:05
Pamietam na Grafice Komputerowej. Mimo wszystko nie byly takie super-banalne (cos z pochodnymi bylo). Ale jak wiadomo, algorytmy graficzne musza cechowac sie duza wydajnoscia a niekoniecznie dokladnoscia, najlepiej jak dzialaja tylko na liczbach calkowitych i nie uzywaja dzielenia...
Na poczatku za pomoca lustrzanych odbic/obrotow sprowadz wszystkie przypadki do jednego (kat ostry, idziesz w dol w prawo). Potem w kazdym punkcie musisz sie tylko zastanowic czy Twoja linia bedzie zgodniejsza z idealna jak pojdziesz do punktu (x; y+1), czy do (x+1; y+1). - Wszystkich? Niewykonalne. , Norton 3/06/09 14:18
Z tego co mi wiadomo to odcinek łączący 2 punkty jest tworem o nieskończenie małej grubości. Z tego wnioskuję że może na niej leżeć nieskończenie wiele punków niezależnie od jej długości.
Ale ja gupi jestem i mogę się mylić.Zmień swój podpis na Boardzie
maks 100 znaków, 3 linie,
zabroniony spam oraz reklama - nie nie, chodzi o cos prostszego , kubazzz 3/06/09 14:31
masz np "szachownice".
droga miedzy punktem A a B wiedzie przez ilestam pol, przy zalozeniu ze kolejne pole musi sie stykac chociazby wiercholkiem.
Po prostu jest ograniczony zbior punktow, pikseli.
Bez aliasingu.
Zrobiłem coś takiego:
$punkt_x=array();
$punkt_y=array();
$x1 = 1;
$x2 = 100;
$y1 = 1;
$y2 = 100;
if(isset($_POST['x1']))
{
$x1 = $_POST['x1'];
}
if(isset($_POST['x2']))
{
$x2 = $_POST['x2'];
}
if(isset($_POST['y1']))
{
$y1 = $_POST['y1'];
}
if(isset($_POST['y2']))
{
$y2 = $_POST['y2'];
}
if (abs($x2-$x1)>abs($y2-$y1))
{
if($x2>$x1)
{
for ($x=$x1;$x<=$x2;$x++)
{
$y=$y1+round(($y2-$y1)*($x-$x1)/($x2-$x1));
$punkt_x[]=$x;
$punkt_y[]=$y;
}
}
else
{
for ($x=$x2;$x<=$x1;$x++)
{
$y=$y2+round(($y1-$y2)*($x-$x2)/($x1-$x2));
$punkt_x[]=$x;
$punkt_y[]=$y;
}
}
}
else
{
if($y2>$y1)
{
for ($y=$y1;$y<=$y2;$y++)
{
$x=$x1+round(($x2-$x1)*($y-$y1)/($y2-$y1));
$punkt_x[]=$x;
$punkt_y[]=$y;
}
}
else
{
for ($y=$y2;$y<=$y1;$y++)
{
$x=$x2+round(($x1-$x2)*($y-$y2)/($y1-$y2));
$punkt_x[]=$x;
$punkt_y[]=$y;
}
}
}
$i = 0;
foreach($punkt_x as $x)
{
echo $x;
echo ",";
echo $punkt_y[$i];
$i++;
echo "<br/>";
}
http://gimeproject.pl/punkty.php
Coś tutaj się rzuca w oczy co mogłem ominąć?;)SM-S908 - Za bartkiem_mi , Norton 3/06/09 15:28
http://www.codecodex.com/...enham's_line_algorithm
dodatkowo
<?php
/****************************************************
Bresenham Line Algorythm PHP/GD implementation
****************************************************/
function line($im,$x1,$y1,$x2,$y2,$color){
$deltax=abs($x2-$x1);
$deltay=abs($y2-$y1);
if ($deltax>$deltay) {
$numpixels=$deltax+1;
$d=(2*$deltay)-$deltax;
$dinc1=$deltay << 1; $dinc2=($deltay-$deltax) << 1;
$xinc1=1; $xinc2=1;
$yinc1=0; $yinc2=1;
} else {
$numpixels=$deltay+1;
$d=(2*$deltax)-$deltay;
$dinc1=$deltax << 1; $dinc2=($deltax-$deltay)<<1;
$xinc1=0; $xinc2=1;
$yinc1=1; $yinc2=1;
}
if ($x1>$x2) {
$xinc1=-$xinc1;
$xinc2=-$xinc2;
}
if ($y1>$y2) {
$yinc1=-$yinc1;
$yinc2=-$yinc2;
}
$x=$x1;
$y=$y1;
for ($i=0;$i<$numpixels;$i++) {
imagesetpixel($im,$x,$y,$color);
if ($d<0) {
$d+=$dinc1;
$x+=$xinc1;
$y+=$yinc1;
} else {
$d+=$dinc2;
$x+=$xinc2;
$y+=$yinc2;
}
}
return ;
}
?>Zmień swój podpis na Boardzie
maks 100 znaków, 3 linie,
zabroniony spam oraz reklama
- hmm , bartek_mi 3/06/09 14:31
jak to wszystkich?
staloprzecinkowo? wspolrzedne pikseli?
to algorytm bresenhama - to sa podstawy...dzisiaj jest jutrzejszym wczoraj - ok, dzięki za dotychczasową pomoc wszystkim, ale jest jeszcze jedno "ALE"... , kubazzz 3/06/09 16:03
muszę to przepisać z PHP na C++ :/
C prawie nie znam, ale wiem że PHP pochodzi z C i że tylko trochę uproszczeń jest.
Tutaj mam ostateczną wersję:
http://gimeproject.pl/punkty.php
http://gimeproject.pl/punkty.src - źródło w PHP
Pogrzebałem trochę w jakiś tutorialach i mam coś takiego
__
#include <iostream>
#include <string> // nie wiem co jeszcze muszę includować
using namespace std;
int main () // tutaj się zaczyna główny program
{
// deklaracja zmiennych
int x,y,x1,x2,y1,y2;
int x_min = 1;
int x_max = 100;
int y_min = 1;
int y_max = 100;
int punkt[2];
int odcinek []; // nie wiem jak zadeklarować dwuwymiarową tablicę bez określonej z góry długości
string msg[]; // to samo ze stringami
// potem przeklejka z tego głównego kodu chyba byłaby prosta, ale nie wiem do końca jaka jest standardowa metoda na wywalanie danych i pobieranie ich od użytkownika
cout << "Podaj X1: ";
getline (cin, x1);
//tak to się robi?
// i tak naprawdę największy problem - sprawdzanie poprawności tych zmiennych, wg idei w tym source z php, ale wiem że w C++ jest inny rygor, inna tolerancja na błędy, a program się nie może wysypać. Musi sprawdzić czy to jest Intiger (a nie float, albo string), czy mieści się w zakresie.
return 0;
}
Trochę się pokomplikowało jak widać, ale to prawdopodobnie mój pierwszy i ostatni raz z C++ w tym roku.
Nie pytajcie po co mi to i nie bójcie się, że będę niedouczonym programistą bo nie zamierzam być programistą, w ogóle cała ta sprawa jest pokręcona, ale muszę to zamknąć.
Z góry dziękuję.SM-S908 - źródło jest , kubazzz 3/06/09 16:04
jeszcze http://gimeproject.pl/punkty.txt
i nie bijcie, przynajmniej się staram i próbuję:DSM-S908
- temat zamknięty , kubazzz 4/06/09 00:34
poradziłem sobie :)
dziękuję za zainteresowanie.SM-S908 |
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|