C++ Sprawdzanie czy myszka jest w środku obiektu

0

Witam,
zacząłem robić projekt z tego linku: http://4programmers.net/Forum/Newbie/188836-projekt_do_szkoly-_wybor?p=792428#comment-39740

Za pomocą tego artykułu: http://arvangen.wordpress.com/2011/02/14/z-cyklu-boso-przez-srodziemie-biblioteka-gdi-oraz-jak-sprawdzic-czy-kursor-zawiera-sie-w-figurze-geometrycznej/
Tylko jest to zrobione w C# więc muszę to przerobić na c++.

Zrobiłem już wyświetlanie współrzędnych, chciałem określić granice województwa, jednak nie znalazłem takiej funkcji w C++ jakiej użył kolo w tamtym artykule.
Więc utworzyłem pióro.

Utworzyłem punkty takim sposobem:

Point point1 = Point(74, 125); 

I określiłem te punkty

array<Point>^ pomorze = {point1,point2,point3,point4,point5}; 

Teraz chciałem sprawdzać czy myszka się znajduje wewnątrz tego wielokąta. W tamtym artykule użyto funkcji IsVisible. Niestety w C++ nie ma takiej. Więc co polecacie aby sprawdzać czy myszka znajduje się wewnątrz wielokąta?

0

http://warsztat.gd/articles.php?x=view&id=192

tu jest ten artykuł. jeśli znowu się nie wczyta, to wpisz w google "punkt wewnątrz wielokąta".

audia4 napisał(a)

odpaliłem, nie ma nic prostszego? Programuje w visual c++

ale to nie jest trudne. wystarczy trochę pogłówkować, wdrążyć się w problem, napisać kod (w tym wypadku przydałyby się też testy) i gotowe. nie wszystkie aplikacje da się wyklikać

0

po prostu sprawdz czy suma katow miedzy tym pktem a wierzcholkami wielokata jest rowna 360

0

No tak, ale w tym artykule: http://arvangen.wordpress.com/2011/02/14/z-cyklu-boso-przez-srodziemie-biblioteka-gdi-oraz-jak-sprawdzic-czy-kursor-zawiera-sie-w-figurze-geometrycznej/
Gościu użył czegoś takiego

 else if (gpGondor.IsVisible(e.X, e.Y))
    krainaLabel.Text = "Wybrałeś Gondor";

A że ja też piszę w .Net'owym języku to myślałem, że jest jakiś odpowiednik niego.

0

Wspolrzedne myszki masz (x, y).
Dajmy na to, ze masz sprawdzic, czy znajduje sie kursor w prostokacie.
Prostokat ma 4 wierzcholki spradzasz wiec kat miedzy
A-B-(x, y) obliczysz to z twierdzenia cosinusow chociazby
B-C-(x, y)
C-D-(x, y)
D-A-(x, y)
Liczysz sume ich wszystkich. Jezeli jest mniejsza od 360, to znaczy, ze kursor jwst poza proatokatem. Mozesz zrobic granice bledu np. 0.00001.

0

A jak np. będę miał ok 40 punktów na każde województwo, więc dużo roboty z tym by było.

Najlepiej by było jakby ktoś mi pomógł ten kod przerobić na visual C++

private void mapkaPictureBox_MouseDown(object sender, MouseEventArgs e)
02
{
03
//tworzymy obiekt klasy Graphics, który będzie potrzebyny do narysowania ramek
04
Graphics g = mapkaPictureBox.CreateGraphics();
05
 
06
//tworzymy prosokąt ograniczający Mordor
07
Rectangle rMordor = new Rectangle(530, 270, 190, 100);
08
 
09
//tworzymy wielkoąt, który będzie reprezentował granice Gondoru
10
Point p1 = new Point(340, 280);
11
Point p2 = new Point(310, 320);
12
Point p3 = new Point(390, 320);
13
Point p4 = new Point(400, 350);
14
Point p5 = new Point(445, 300);
15
Point [] pTab = new Point[] {p1,p2,p3,p4,p5};
16
GraphicsPath gpGondor = new GraphicsPath();
17
gpGondor.AddPolygon(pTab);
18
 
19
//rysujemy na mapie prostokąt reprezentujący Mordor,
20
//oraz wielkoąt reprezentujący Gondor
21
//Możemy pominąć rysowanie, aby mapka ładniej wyglądała
22
g.DrawRectangle(new Pen(Color.Red, 3), rMordor);
23
g.DrawPath(new Pen(Color.Blue,3),gpGondor);
24
 
25
//sprawdzamy czy kursor w czasie klkinięcia był w obrębie Mordoru lub Gondoru
26
if (rMordor.Contains(e.X, e.Y))
27
    krainaLabel.Text = "Wybrałeś Mordor";
28
else if (gpGondor.IsVisible(e.X, e.Y))
29
    krainaLabel.Text = "Wybrałeś Gondor";
30
else
31
    krainaLabel.Text = "Wybierz Mordor lub Gondor";
32
}
 
0

Cześć!

Mam nadzieje że w jakiś sposób pomoże:


using namespace System::Drawing::Drawing2D;

GraphicsPath^ myPath;
	private: System::Void pictureBox1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
				 myPath = gcnew GraphicsPath;
				 
				 Pen^ myPen = gcnew Pen( Color::Black,2.0f );
				 
				 Point p1 = Point(0, 0);
				 Point p2 = Point(0, 50);
				 Point p3 = Point(10, 60);
				 Point p4 = Point(40, 60);

				 array<Point>^ myArray = {p1, p2, p3, p4};
				 myPath->AddPolygon(myArray);

				 e->Graphics->DrawPath( myPen, myPath );
		}
	private: System::Void pictureBox1_MouseClick(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
				 Point myPoint = Point(e->X, e->Y);

			     MessageBox::Show(Convert::ToString(myPath->IsVisible(myPoint)));
			 }

Pozdrawiam!

0

Jestem z Łodzi :)

Linijka o którą pytasz... posłużyła do "wykreślenia" tego poligonu w pictureboksie. Zrobiłem ją globalnie żeby móc potem sprawdzić w zdarzeniu mouseclick picutreboksa czy punkt kliknięcia myszy jest widoczny w tym obszarze myPath określonych tymi punktami p1, p2 ...

Cieszę się że mogłem pomóc.

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