23/07/20 11:41:22.96 FCPwP+wT0.net
平面上の4点A,B,C,Dが存在している。
Aから反時計回りにのこりの3点を線分で結んだときに凸四角形ができるようにする
in3 <- \(P,A,B,C){
opc <- \(a,b) Re(a)*Im(b)-Im(a)*Re(b)
sum(opc(B-A,P-A)>0,opc(C-B,P-B)>0,opc(P-A,C-A)>0)%%3==0
}
is.concave=\(A,B,C,D){
c(in3(A,B,C,D),in3(B,C,D,A),in3(C,D,A,B),in3(D,A,B,C)) |> any()
}
Do =\(){
sq=cbind(runif(4),runif(4))
sq=round(sq,2)
A=sq[1,1]+1i*sq[1,2]
B=sq[2,1]+1i*sq[2,2]
C=sq[3,1]+1i*sq[3,2]
D=sq[4,1]+1i*sq[4,2]
ABCD=c(A,B,C,D)
G=mean(ABCD)
if(is.concave(A,B,C,D)){
par(mfrow=c(2,2))
Plot(0,1,zero=FALSE) ; pta(A) ; pta(B) ; pta(C) ; pta(D) ; pt(G,'.')
Plot(0,1,zero=FALSE) ; pta(A) ; pta(B) ; pta(C) ; pta(D) ; pt(G,'.')
Polygon(A,B,C,D)
Plot(0,1,zero=FALSE) ; pta(A) ; pta(B) ; pta(C) ; pta(D) ; pt(G,'.')
Polygon(A,C,B,D,Col=2)
Plot(0,1,zero=FALSE) ; pta(A) ; pta(B) ; pta(C) ; pta(D) ; pt(G,'.')
Polygon(A,B,D,C,Col=3)
}else{
layout(1)
Arg(ABCD-G) |> order() -> ord
tmp=c(ord,ord)
i=which(tmp==1)[1]
ord=tmp[i:(i+3)]
cat(LETTERS[ord],'\n')
Plot(0,1,zero=FALSE) ; pta(A) ; pta(B) ; pta(C) ; pta(D) ; pt(G,'.')
Polygon(ABCD[ord])
}
invisible(ABCD)
}
(Do())