J, 40 39 34 byte
3 :'(o.1)<(>./-<./)12 o.y*+{.y'@:-
Fungsi diad anonim, mengambil titik, p , sebagai salah satu argumennya, dan daftar titik, P , sebagai argumen lain (tidak masalah argumen mana), dan mengembalikan 0atau 1, jika p berada di luar atau di dalam lambung cembung P , masing-masing. Titik p , dan titik dalam P , diambil sebagai bilangan kompleks.
Contoh
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
atau...
Python 2, berfungsi, 121 103, program lengkap, 162
Python 3, 149 byte
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)
Mengambil input, dalam format yang sama dengan posting asli, melalui STDIN, dan mencetak nilai boolean yang menunjukkan apakah p ada dalam cembung cembung P
Penjelasan
Program menguji apakah perbedaan antara sudut maksimum dan minimum (ditandatangani) antara titik r dalam P , p , dan titik arbitrer tetap q dalam P (kami hanya menggunakan titik pertama dalam P ), kurang dari 180 °. Dengan kata lain, itu menguji apakah semua titik di P terkandung dalam sudut 180 ° atau kurang, sekitar p .
p adalah dalam cembung lambung P jika dan hanya jika kondisi ini salah.
Dengan biaya beberapa byte lagi, kita dapat menggunakan metode serupa yang tidak mengharuskan kita menghitung sudut secara eksplisit: Perhatikan bahwa kondisi di atas setara dengan mengatakan bahwa p berada di luar cembung cembung P jika dan hanya jika ada garis l sampai p , sedemikian sehingga semua titik dalam P berada di sisi yang sama dengan l . Jika garis seperti itu ada, maka ada juga garis yang merupakan insiden pada satu (atau lebih) titik di P (kita dapat memutar l sampai menyentuh salah satu titik di P. )
Untuk (tentatif) menemukan baris ini, kita mulai dengan membiarkan l menjadi garis melalui p dan titik pertama di P . Kami kemudian mengulangi sisa poin dalam P ; jika salah satu poin berada di sebelah kiri l (kami menganggap beberapa arah di seluruh, kiri atau kanan tidak terlalu penting,) kami mengganti l dengan garis yang melewati p dan titik itu, dan melanjutkan. Setelah kita mengulangi semua P , jika (dan hanya jika) p berada di luar cembung cembung, maka semua titik dalam P harus di sebelah kanan (atau pada) l . Kami memeriksa bahwa menggunakan pass kedua atas poin di P.
Python 2, 172 byte
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)
Sebagai alternatif, untuk melakukan hal yang sama dalam satu lintasan, biarkan ke-kiri- menjadi realsi antara dua titik, q dan r , dalam P , sedemikian sehingga q ada di kiri r jika q ada di kiri dari garis yang melewati p dan r . Perhatikan bahwa to-the-kiri dari sebuah hubungan order pada P jika dan hanya jika semua poin di P berada di sisi yang sama dari beberapa garis yang melewati p , yaitu, jika p adalah luar lambung cembung P . Prosedur yang dijelaskan di atas menemukan titik minimum dalam Pwrt urutan ini, yaitu, "paling kiri" titik dalam P . Alih-alih melakukan dua lintasan, kita dapat menemukan maksimum (yaitu, titik "paling kanan"), serta minimum, poin dalam P wrt urutan yang sama dalam satu lintasan, dan memverifikasi bahwa minimum berada di sebelah kiri maksimum, yaitu, secara efektif, bahwa di sebelah kiri adalah transitif.
Ini akan bekerja dengan baik jika p berada di luar convex hull dari P , dalam hal mana ke-kiri-sebenarnya adalah relasi urutan, tetapi dapat pecah ketika p berada di dalam convex hull (misalnya, cobalah mencari tahu apa yang akan terjadi jika kita menjalankan algoritma ini di mana titik dalam P adalah simpul dari segi lima biasa, berjalan berlawanan arah jarum jam, dan p adalah pusatnya.) Untuk mengakomodasi, kami sedikit mengubah algoritme: Kami memilih titik q dalam P , dan membagi dua P sepanjang garis yang melewati p dan q (yaitu, kita mempartisi P di sekitar qwrt to-the-left-of.) Kita sekarang memiliki "bagian kiri" dan "bagian kanan" P , masing-masing terkandung dalam setengah pesawat, sehingga ke-kiri-dari adalah relasi urutan pada masing-masing; kami menemukan minimum bagian kiri, dan maksimum bagian kanan, dan membandingkannya seperti dijelaskan di atas. Tentu saja, kita tidak perlu membagi dua P secara fisik , kita dapat dengan mudah mengklasifikasikan setiap titik dalam P karena kita mencari minimum dan maksimum, dalam satu lintasan.
Python 2, 194 byte
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)