Saya telah menulis aplikasi GUI berbasis api win32 yang menggunakan fitur GDI+ seperti DrawCurve() dan DrawLine().
Aplikasi ini menggambar garis dan kurva yang mewakili multigraf.
Struktur data untuk edge hanyalah sebuah struct yang terdiri dari lima int. (x1, y1, x2, y2, dan id)
Jika hanya ada satu sisi di antara dua simpul, maka segmen garis lurus digambar menggunakan DrawLine(). Jika ada lebih dari satu sisi, kurva digambar menggunakan DrawCurve() -- Di sini, saya menyebarkan tepi garis lurus di sekitar titik tengah dua simpul, sehingga menjadikannya kurva. Suatu titik yang terpisah beberapa satuan piksel dihitung menggunakan persamaan garis normal. Jika lebih banyak sisi yang ditambahkan, maka dipilih satu piksel yang berjarak dua satuan piksel dari titik tengahnya, lalu berikutnya 3 satuan piksel, dan seterusnya.
Sekarang saya punya dua pertanyaan tentang mendeteksi klik di tepinya.
Dalam menemukan tepi garis lurus, untuk meminimalkan waktu pencarian, apa yang harus saya lakukan?
Cukup mudah untuk memeriksa apakah piksel yang diklik berada pada segmen garis, namun membandingkan semua tepi akan menjadi tidak efisien jika jumlah tepinya banyak. Tampaknya mungkin untuk melakukannya di O(log n), di mana n adalah jumlah tepi.
EDIT: pada titik ini tepi (kelas Edge) disimpan di std::map yang memetakan id tepi (int)' s ke objek Edge dan saya sedang mempertimbangkan untuk mendeklarasikan container lain yang memetakan piksel ke id Edge.
Saya sedang mempertimbangkan untuk menggunakan pohon pencarian biner tetapi apa kuncinya? Atau haruskah saya menggunakan array piksel 2D saja?Bisakah saya mendapatkan array poin yang digunakan oleh DrawCurve()? Jika ini tidak mungkin, maka saya harus menghitung ulang spline utama, mendapatkan rangkaian titik, dan memeriksa apakah titik yang diklik oleh pengguna cocok dengan titik mana pun dalam larik tersebut.