Wiedzy niewiele tu potrzeba. Trzeba tylko kojarzyć fakty z dokumentacji.
Masz linijkę:
g->DrawLine(redPen, 0, 0, rect.Width, rect.Height);
No i sobie myślisz:
Aha, pierwszy argument to obiekt "długopisu", a następne 2 argumenty to pozycja x, y początku linii, a kolejne 2 argumenty do pozycja końca linii, tak więc w zdarzeniu kliknięcia muszę odkładać sobie pozycję kliknięcia by potem ją jakoś użyć w tej funkcji by narysować linię, wszystkie kliknięte punkty warto odłożyć w tablicy obiektów typu Point by móc potem narysować ładny wypełniony wielokąt. Następnie potrzebna mi będzie funkcja, która wykryje czy jest na obrazie jakiś zamknięty obszar i go wypełni kolorem w razie spełnienia tego warunku. Tą funkcję wykonam po każdym kliknięciu w kodzie tego samego eventa. Do wypełnienia kolorem użyję funkcji wbudowanej, więc poszukam jak się może nazywać, cyk, cyk, cyk, google... http://msdn.microsoft.com/en-us/library/aa327628%28v=vs.71%29.aspx Odkrywam, że jest funkcja, która narysuje mi ładny wielokąt, więc zmieniam podejście, nie rysuję linii, które wypełnię, tylko przy każdym kliknięciu zaznaczam punkt na obrazku, dużą kropką, którą usunę, gdy wielokąt zostanie zamknięty - pierwsza kropka będzie kolidowała z ostatnią. Wtedy wszystkie śmieci na płótnie usuwamy i rysujemy wielokąt, po czym liczymy całkę pixelową.
No i tyle takiego głośnego myślenia, kolizję okręgów możesz łatwo zaprogramować sam. Odległość punktów na płaszczyźnie + promień koła.