8

Kullanıcı arabiriminin bir parçası olarak, seçilebilecek ana görünümünde birçok görsel öğeyi görüntüleyen bir Mac OS X uygulaması geliştiriyorum. Bu elemanlar, görünüm içinde gerçekten herhangi bir yere yerleştirilebilir. UI, elemanları seçmenin çeşitli yollarını destekleyecektir: dikdörtgen seçim çerçevesi seçimi, elips seçim çerçevesi seçimi ve 'serbest' kement seçimi.Bir kement seçim aracı uygulamak için algoritma?

Zaten dikdörtgen ve eliptik seçim çerçevesi seçimim var. Algoritma oldukça basittir; elemanın alanı dikdörtgensel/elips alanı ile kesişiyorsa bir eleman 'seçilmiş' olarak kabul edilir. o Photoshop gibi çağdaş resim işleme uygulamalarında olduğu gibi

kement seçimi sadece çalışacaktır; kullanıcı kendini kapatacak bir yolu tıklayabilir ve sürükleyebilir ve çizilen yolun içerdiği öğeler seçilecektir. seçim şekilde sınırsız olduğu

Bu algoritma muhtemelen, çok daha karmaşık dikdörtgen/eliptik bir seçim daha uzun olacaktır. Birisinin böyle bir şey yazmayı deneyimlediğine ya da ne tür programlama tekniklerine ihtiyaç duyulduğuna ve eğer bu algoritmanın çalışabilmesinin en etkili yolunun bana doğru yönde yönlendirilebileceğini merak ediyorum.

Şimdiden teşekkürler. Aklıma

+0

Merhaba CJ, Bu özellik için kodlamayı başarılı bir şekilde yaptıysanız, lütfen örnek kod için bağlantıyı yapıştırın. Benim için yanı sıra başkaları için de tam olarak yardımcı olacaktır. Çok zamanımızı koruyacaktır. Yardımlarınız için bekleyiniz. – Gyanendra

cevap

7

tek yolu bir poligon, kement anahat tedavi etmektir. Daha sonra hangi öğelerin seçileceğini kontrol etmek için herhangi bir standart point-inside-polygon test kullanabilirsiniz.

Sen Poligon kendisiyle (yani rakam-8) kesişen ne yapacağını bir karar vermek gerekecek.

, belki önceki noktaya çok yakın noktaları atlayabilirsiniz fazla sayıda nokta elde engellemek için, poligonu inşa

(belki 3 piksel bir kez, uygulamaya bağlı olarak).

+0

Teşekkürler, bu tam olarak ihtiyacım olan şey. Vikipedi sayfasından, örnek kodu ve sorunun ardındaki matematiği gösteren bir kaynak buldum: http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html. Bu algoritma benim için gayet iyi çalışıyor, ben algoritmayı, kullanıcı lasso oldukça iyi bir performansa sahip bir bölge seçtiğinde aşamalı olarak bile kullanabilirim. Şimdi noktaların poligona ne sıklıkla eklendiğini optimize etmek için bazı mantık yazıyorum; sadece son nokta arasındaki mesafeye değil, aynı zamanda önceki çizgi segmentlerinin açılarındaki eğimleri/farkı da karşılaştırır. –

2

Çokgen sorunlu bir noktaya bakıyorsunuz: http://en.wikipedia.org/wiki/Point_in_polygon Çokgenin dışbükey olduğunu (büyük olasılıkla) garanti edemezseniz, algoritma daha basit hale gelir. Bir sözlükte seçim sınırın tüm noktaları kaydetme: Bu çok basit bir çözüm sürebilir serbest el kement aracı için

+0

Kement seçimleri genellikle çokgen olmamalıdır - bunlar herhangi bir kapalı yol olabilir. Örneğin Photoshop'ta Kement aracı ve Çokgen Kement aracı vardır. –

+1

Kapalı yol çok sayıda noktaya sahip bir çokgendir. Photoshop'un seçici, çokgendeki sonlu sayıda nesne ve bir çokgen biriminin = bir nesneden oluşması nedeniyle daha kolay hale getirilebilir. –

0

. x anahtar olarak ve (y1, y2) değeri olarak, y1 <= y2. Sonra tüm x' üzerinde döngü ve dikte bir giriş olup olmadığını bakın. Eğer öyleyse, x' = x ve y >= y1 and y <= y2'un bulunduğu tüm noktalar seçim içindedir.

En iyi çözüm olmayabilir, ama işe yaramalı.

İlgili konular