J 40 39 34 bayt
3 :'(o.1)<(>./-<./)12 o.y*+{.y'@:-
Anonim bir diyadik fonksiyon, bir nokta alarak p bağımsız değişkenler biri ve noktaların bir listesi olarak, P (bunun önemi hangisinin hangisi argüman yapar) diğer argüman olarak, ve dönen 0ya 1, eğer p dışında veya sırasıyla P dışbükey gövdesi içinde . Nokta p ve noktaları P , karmaşık sayılar olarak alınmıştır.
Misal
is_inside =: 3 :'(o.1)<(>./-<./)12 o.y*+{.y'@:-
0.5j0.5 is_inside 0j0 0j1 1j0 1j1
1
1.5j0.5 is_inside 0j0 0j1 1j0 1j1
0
veya...
Python 2, fonksiyon, 121 103, tam program, 162
Python 3, 149 bayt
import sys,cmath as C
p,q,*P=[complex(*eval(l.replace(*";,")))for l in sys.stdin]
A=[C.phase((r-p)/(q-p+(q==p)))for r in P]
print(max(A)-min(A)>C.pi)
Orijinal yazı ile aynı formattaki girişi STDIN üzerinden alır ve p'nin P dışbükey gövdesinde olup olmadığını gösteren bir boole değeri yazdırır.
açıklama
Maksimum ve minimum (işaretli) arasındaki fark, herhangi bir nokta arasındaki açı olup programı testleri r içinde p , p , ve sabit bir rasgele nokta q içinde P (sadece ilk noktayı kullanmak P , ° az 180 daha). Diğer bir deyişle, bu tüm noktalar test eder , P , yaklaşık az 180 ° bir açıyla bulunan ° veya edilir p .
p , ancak bu koşul yanlışsa P'nin dışbükey gövdesindedir .
Yukarıdaki durum söyleyerek eşdeğer olduğunu Not: birkaç bayt ücret karşılığında biz de benzer üzere açıkça hesapla açılar bize gerektirmez yöntemi kullanabilirsiniz p dışbükey gövde dışında P ancak ve varsa yalnızca bir satır l ile p tüm noktalar öyle ki, P aynı tarafta l . Böyle bir hat varsa, o zaman olay noktaların bir (veya daha fazla) olan bir çizgi de var P (biz döndürme l bu noktalar arasında bir temas edene kadar P ).
(Geçici) bu satırı bulmak için, izin vererek başlamak l geçen doğru p ve ilk nokta P . Sonra noktaların kalanını üzerinde yineleme P ; noktalardan biri l' in solundaysa (bir yönde bir yönelim olduğunu, sol veya sağın gerçekten önemli olmadığını düşünüyoruz), l yerine p ve o noktadan geçen çizgiyi koyarız ve devam ederiz. Önemli tüm iterated sonra P , (ve sadece) p sonra tüm noktalar, konveks gövdenin dış olduğu P (veya) sağında olmalıdır l . Biz de puan üzerinden ikinci bir geçiş kullanılarak kontrol P.
Python 2, 172 bayt
import sys
P=[eval(l.replace(*";,"))for l in sys.stdin]
x,y=P.pop(0)
C=lambda(a,b),(c,d):(a-x)*(d-y)-(b-y)*(c-x)>0
l=reduce(lambda*x:x[C(*x)],P)
print any(C(l,q)for q in P)
Alternatif olarak, izin tek geçişte aynısını yapmaya için-sol ve herhangi iki nokta arasında bir realtion olmak q ve r de, P , öyle ki, q, sol için r ise q solunda p ve r'den geçen hattın . İçin-sol-o ile ilgili bir emir ilişkidir Not P eğer tüm noktaları sadece P içinden geçen bir çizginin aynı tarafta p ise, olduğu, s konveks gövdenin dış olup , P . Prosedürü buluntular üzerinde en az noktası tarif Pwrt bu sıra, yani P "en soldaki" nokta . İki geçiş yapmak yerine, P'de aynı sırayla maksimum (yani "en sağdaki" noktayı) hem de minimum noktaları bulabilir ve minimumun tek geçişte olduğunu doğrulayabiliriz. maksimum, yani etkili bir şekilde sola doğru geçişlidir.
Bu iyi çalışacak p dışbükey gövde dışında P , bu durumda to-sola-aslında bir emir ilişkisi olmakla ne zaman bozabilir p (örneğin dışbükey gövde içinde olduğunu, ne olacak anlamaya çalışalım içinde noktaları bu algoritma bitince ne p saat yönünün tersine çalışan, düzenli beşgen noktalar vardır ve s . Biz bir nokta seçin: onun merkezidir) yerleştirmek için, biraz algoritma değiştirmek q içinde p ve kenarortay P içinden geçen bir çizgi boyunca p ve q (yani, biz bölümü P etrafında qwrt to-the-left-of.) Artık P'nin bir "sol kısmı" ve bir "sağ kısmı" var , her biri yarım düzlemde yer alıyor, böylece sola doğru her biri için bir sipariş ilişkisi; sol parçanın minimumunu ve sağ parçanın maksimumunu buluruz ve bunları yukarıda açıklandığı gibi karşılaştırırız. Tabii ki, biz fiziksel olarak kenarortay gerekmez P , biz sadece her noktayı sınıflandırabilirim P biz tek geçişte, minimum ve maksimum göründüğün gibi.
Python 2, 194 bayt
import sys
P=[eval(l.replace(*";,"))for l in sys.stdin]
x,y=P.pop(0)
C=lambda(a,b),(c,d):(a-x)*(d-y)-(b-y)*(c-x)>0
l=r=P[0]
for q in P:
if C(P[0],q):l=q*C(l,q)or l
elif C(q,r):r=q
print C(l,r)