เจ 40 39 34 ไบต์
3 :'(o.1)<(>./-<./)12 o.y*+{.y'@:-
ฟังก์ชั่นที่ไม่ระบุชื่อ dyadic, การจุดPเป็นหนึ่งในข้อโต้แย้งของตนและรายการของจุดที่P , เป็นอาร์กิวเมนต์อื่น ๆ (มันไม่ได้เรื่องที่เป็นข้อโต้แย้งที่) และกลับมา0
หรือ1
ถ้าPอยู่นอกหรือ ภายในตัวเรือนูนของPตามลำดับ จุดpและจุดต่างๆในPถือเป็นจำนวนเชิงซ้อน
ตัวอย่าง
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
หรือ...
Python 2 ฟังก์ชั่น 121 103โปรแกรมเต็มรูปแบบ 162
Python 3, 149 ไบต์
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)
รับอินพุตในรูปแบบเดียวกับโพสต์ดั้งเดิมผ่าน STDIN และพิมพ์ค่าบูลีนที่ระบุว่า p อยู่ในเปลือกนูนของ P หรือไม่
คำอธิบาย
โปรแกรมทดสอบว่าความแตกต่างระหว่างมุมสูงสุดและต่ำสุด (เซ็นชื่อ) ระหว่างจุดใด ๆrในP , pและจุดคงที่qในP (เราเพิ่งใช้จุดแรกในP ) น้อยกว่า 180 ° ในคำอื่น ๆ การทดสอบว่าทุกจุดในPมีอยู่ในมุมของ 180 °หรือน้อยกว่ารอบหน้า
pอยู่ในตัวนูนของPถ้าหากเงื่อนไขนี้เป็นเท็จ
ด้วยค่าใช้จ่ายอีกไม่กี่ไบต์เราสามารถใช้วิธีที่คล้ายกันซึ่งไม่ต้องการให้เราคำนวณมุมอย่างชัดเจน: โปรดทราบว่าเงื่อนไขข้างต้นเทียบเท่ากับการบอกว่าpอยู่นอกตัวเรือนูนของPถ้าหากมีอยู่เท่านั้น บรรทัดลิตรผ่านหน้าเช่นว่าทุกจุดในPอยู่ในด้านเดียวกันของลิตร หากมีเส้นดังกล่าวอยู่แสดงว่ามีเส้นดังกล่าวเกิดขึ้นกับจุด (หรือมากกว่า) หนึ่งจุดในP (เราสามารถหมุนlจนกว่าจะแตะจุดใดจุดหนึ่งในP )
ที่จะ (ไม่แน่นอน) พบว่าสายนี้เราเริ่มต้นด้วยการปล่อยให้ลิตรเป็นสายผ่านหน้าและจุดแรกในP จากนั้นเราก็ย้ำผ่านจุดที่เหลือในP ; หากจุดใดจุดหนึ่งอยู่ทางซ้ายของl (เราถือว่าทิศทางบางอย่างตลอดทางซ้ายหรือขวาไม่สำคัญจริงๆ) เราแทนที่lด้วยเส้นตรงผ่านpและจุดนั้นแล้วดำเนินการต่อ หลังจากที่เราซ้ำมากกว่าทั้งหมดของPถ้า (และถ้ามี) หน้าอยู่นอกเปลือกนูนแล้วทุกจุดในPควรจะไปทางขวาของ (หรือ) จากลิตร เราตรวจสอบว่าใช้การผ่านครั้งที่สองเหนือคะแนนในP.
Python 2, 172 ไบต์
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)
อีกวิธีหนึ่งในการทำสิ่งเดียวกันในการส่งครั้งเดียวให้ไปทางซ้ายของการเป็น realtion ระหว่างจุดสองจุดใด ๆqและrในPเช่นนี้qอยู่ทางซ้ายของrถ้าqอยู่ทางซ้าย ของเส้นผ่านหน้าและR โปรดทราบว่า to-ซ้ายคือความสัมพันธ์ในการสั่งซื้อPและถ้าหากทุกจุดในPอยู่ในด้านเดียวกันของเส้นบางผ่านหน้า , ที่อยู่, ถ้าPอยู่นอกเปลือกนูนของP ขั้นตอนที่อธิบายข้างต้นพบว่าจุดต่ำสุดในPwrt คำสั่งนี้คือการ "ซ้ายสุด" จุดในP แทนที่จะทำสองรอบเราสามารถค้นหาจุดสูงสุด (เช่นจุด "ขวา") รวมถึงจุดต่ำสุดจุดในP wrt ลำดับเดียวกันในรอบเดียวและตรวจสอบว่าขั้นต่ำอยู่ทางซ้ายของ สูงสุดคือได้อย่างมีประสิทธิภาพที่ไปทางซ้ายของสกรรมกริยา
สิ่งนี้จะทำงานได้ดีถ้าpอยู่นอกตัวถังนูนของPซึ่งในกรณีนี้ไปทางซ้าย - ของจริง ๆ แล้วเป็นความสัมพันธ์แบบลำดับ แต่อาจแตกหักเมื่อpอยู่ภายในตัวเรือนูน (เช่นพยายามหาว่าจะทำอะไร เกิดขึ้นถ้าเราวิ่งอัลกอริธึมนี้ซึ่งจุดในPคือจุดยอดของรูปห้าเหลี่ยมปกติ, วิ่งทวนเข็มนาฬิกาและpเป็นศูนย์กลางของมัน) เพื่อรองรับเราเปลี่ยนอัลกอริธึมเล็กน้อย: เราเลือกจุดqในPและ bisect Pตามเส้นผ่านpและq (เช่นเราแบ่งพาร์ติชันPประมาณqwrt to-the-the-of.) ตอนนี้เรามี "ส่วนด้านซ้าย" และ "ส่วนด้านขวา" ของPซึ่งแต่ละอันมีอยู่ใน halfplane เพื่อให้ความสัมพันธ์ด้านซ้ายมีความสัมพันธ์ตามลำดับ เราพบค่าต่ำสุดของส่วนด้านซ้ายและค่าสูงสุดของส่วนด้านขวาและเปรียบเทียบกับส่วนที่อธิบายไว้ข้างต้น แน่นอนว่าเราไม่จำเป็นต้องตัดแบ่งทางกายภาพPเราสามารถจำแนกแต่ละจุดเป็นP ได้เมื่อเรามองหาค่าต่ำสุดและสูงสุดในการผ่านครั้งเดียว
Python 2, 194 ไบต์
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)