Przekątna prostokąta

0

Witam.

W jaki sposób mogę wyliczyć, które kratki najbardziej odpowiadają przekątnej prostokąta?

Poniżej zamieściłem tekstowy rysunek przedstawiający prostokąt o rozmiarze 8x8, kratki oznaczone jako C są zawarte w prostokącie 4x7, jak mogę wyliczyć, które kratki najbardziej odpowiadają linii prostej(między punktami C-C), przekątnej

[X][X][C][X][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][X][C][X][X]
[X][X][X][X][X][X][X][X]

Dla przykładu, gdyby rysunek wyglądał tak:

[X][X][X][X][X][X]
[X][C][X][X][X][X]
[X][X][A][X][X][X]
[X][X][X][A][X][X]
[X][X][X][X][C][X]
[X][X][X][X][X][X]

przekątna między punktami C-C jest zarysowana punktami A

Pozdrawiam i z góry dziękuje za wszystkie pomocne odpowiedzi

0

Założenie: lewy dolny róg to punkt (0,0)

Masz punkt C1 = (2,7) i C2 = (5,1)

y = ax + b

7 = 2a + b
1 = 5a + b

=> a = -2, b = 11 => Y = -2*X + 11

X nalezy do przedziału <2, 5>

X = 2, Y = 7
X = 3, Y = 5
X = 4, Y = 3
X = 5, Y = 1

0

ze wzoru y = ax + b. Zobrazuję to tak.
http://fotoszek.pl/di-L8KI.jpg
I wszystko jasne ;]

EDIT: Spóźniłem się ;-) za długo rysowałem .

0

Dzięki wielkie

A jest możliwość wyliczyć tak, żeby te punkty były połączone?

Przykładowo:

Jak powinny wyglądać przekątne w różnych przypadkach:

[C][X]
[A][X]
[X][C]

[X][C]
[A][X]
[C][X]

[X][X][A][C]
[X][A][X][X]
[C][X][X][X]

[X][X][X][C]
[X][X][A][X]
[X][A][X][X]
[A][X][X][X]
[C][X][X][X]

[C][X][X]
[A][X][X]
[X][A][X]
[X][A][X]
[X][X][C]

[X][A][A][A][C]
[C][X][X][X][X]

Konkretnie mi chodzi o algorytm, który sprawdzi w grze czy z danej kratki da się strzelić w przeciwnika na innej kratce, na przekątnej są sprawdzane czy istnieje jakiś przedmiot, który blokuje pociski

Pozdrawiam, mam nadzieje, że pomożecie mi określić jak można wyliczyć "przekątne" takim sposobem jak pokazałem na powyższych rysunkach, mam już ten problem od jakiegoś czasu dlatego korzystam z pomocy innych programistów

0

To dokładnie ten sam algorytm:
C1 = (0,0)
C2 = (4, 1)
0 = b
1 = 4a
a = 0.25
y = 0.25x

dla x = 1
y = 0.25 = 0
dla x = 2
y = 0.5 = 0
dla x = 3
y = 0.75 = 0
dla x = 4
y = 1
[x ][X][X][X][C2]
[C1][A][A][A][X ]
Tak by to wyglądało dla zaokrąglania w dół (domyślnie)

y = 0.25 = 0
y = 0.5 = 1
y = 0.75 = 1
y = 1

[X ][X][A][A][C2]
[C1][A][X][X][X]
Tak byłoby dla matematycznych zasad zaokrąglania
Algorytm tego zaokrąglenia to

inline int round(double a)
{
    return (a + 0.5);
}

A tak dla zaokrąglania w górę.
[X ][A][A][A][C2]
[C1][X][X][X][X ]

0

Zaokrąglanie OK, ale to nie rozwiązuje problemu z pierwszego posta:
C1 = (2,7) i C2 = (5,1)

Jak wyliczył Madm4n:
y = -2*x + 11 (równanie 1)

Dostaniemy "rozstrzelone" punkty:

X = 2, Y = 7
X = 3, Y = 5
X = 4, Y = 3
X = 5, Y = 1

[X][X][C][X][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][a][X][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][a][X][X][X]
[X][X][X][X][X][X][X][X]
[X][X][X][X][X][C][X][X]
[X][X][X][X][X][X][X][X]

Ja bym proponował "zamienić" x i y by otrzymać:
x = -0.5y + 5.5 (dzielimy równanie 1 przez -2 i "porządkujemy") (równanie 2)

Równanie 2 opisuje nadal tą samą prostą co równanie 1.

Teraz dla kolejnych y x zaokrąglamy jak MJay chciał:

y = 1, x = 5
y = 2, x = 4.5 -> x = 5
y = 3, x = 4
y = 4, x = 3.5 -> x = 4
y = 5, x = 3
y = 6, x = 2.5 -> x = 3
y = 7, x = 2

Otrzymujemy:

X = [5, 5, 4, 4, 3, 3, 2]
Y = [1, 2, 3, 4, 5, 6, 7]

Efekt: "ciągła" prosta

[X][X][C][X][X][X][X][X]
[X][X][X][a][X][X][X][X]
[X][X][X][a][X][X][X][X]
[X][X][X][X][a][X][X][X]
[X][X][X][X][a][X][X][X]
[X][X][X][X][X][a][X][X]
[X][X][X][X][X][C][X][X]
[X][X][X][X][X][X][X][X]

To czy "odwracać" równanie 1 ustalamy patrząc na zakres współrzędnych punktów końcowych:

C1 = (2,7) i C2 = (5,1)

abs(C1x - C2x) = 3
abs(C1y - C2y) = 6

Tu "zakres" po współrzędnej y jest większy, więc biorąc y za zmienną niezależną otrzymamy lepszą "rozdzielczość" punktów na prostej łączacej C1 i C2.

Gdy x był zmienną niezależną otrzymaliśmy tylko 4 punkty.
Gdy y był zmienną niezależną otrzymaliśmy już 7 punków.

Czyli najpierw sprawdzamy po której zmiennej x czy y "zakres" jest większy i wyznaczamy od razu porządane równanie. Otrzymamy od razu współrzędne wszystkich punktów z zakresu zaokrąglone w wybrany przez nas sposób.

Pozdrawiam

0

Dzielenie równania przez 2 jest bez sensu, gdyż jak sam zauważyłeś dalej to jest to samo równanie, a dołożyłeś tylko operacji dzielenia.

Nic nie trzeba zmieniać, tylko my sprawdzaliśmy ze względu na X, a ty ze względu na y.
Według twojej metody nie obliczysz przypadku tego co ja rozwijałem, bo będziesz miał tylko dla przypadku y = 0 i y = 1.

Proponuję w takim układzie jeżeli chodzi o linię ciągłą to sprawdzić najpierw warunek czy więcej jest argumentów y czy x. Dla tego co ma większą ilość argumentów przekształcić równanie. Jeżeli x > y, to rozpatrujemy ze względu dla x = 0, x = 1, x = 2... . Natomiast jeżeli y > x to obliczamy po prostu x. Nie trzeba nic kombinować.

0

Nie doczytałeś mojego posta do końca... ale niech tam...

Czyli najpierw sprawdzamy po której zmiennej x czy y "zakres" jest większy i wyznaczamy od razu porządane równanie. Otrzymamy od razu współrzędne wszystkich punktów z zakresu zaokrąglone w wybrany przez nas sposób.

0

Witam, problem udało mi się rozwiązać, ale nie miałem dostępu do internetu i nie mogłem o tym poinformować

Zrobiłem to właśnie zaokrąglaniem w dół, tylko w zależności co jest większe (szerokość czy wysokość prostokąta) to obliczam równaniem X lub Y

Dzięki za podpowiedź, że można to było rozwiązać układem równań prostej przechodzącej przez dwa punkty w układzie współrzędnych

Pozdrawiam

Edit:

Nie zauważyłem końcowego posta, że MJay dokładnie takie samo podał rozwiązanie jak to co ja wymyśliłem (ze sprawdzaniem X i Y)

Nie byłem do końca przekonany, czy dobrze to zrobiłem ale jeżeli ktoś inny też tak pomyślał to znaczy, że rozwiązanie jest dobre :)

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1