/* Polygon in Picat. From Jean Francois Puget: "Chebyshev Centers of Polygons in OPL" https://www.ibm.com/developerworks/community/blogs/jfp/entry/chebyshev_centers Solution: r = 1.7465949 x = 3.2369975 y = 2.7465949 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import mip. main => go. go ?=> N = 5, Vertices = {{1,1}, {2,5}, {5,4}, {6,2}, {4,1}}, % nextc is the circular version of next % {edge} edges = { | v in vertices}; Edges = {{1,1, 2,5, 2-1, 5-1}, {2,5, 5,4, 5-2, 4-5}, {5,4, 6,2, 6-5, 2-4}, {6,2, 4,1, 4-6, 1-2}, {4,1, 1,1, 1-4, 1-1}}, [R,X,Y] :: 0.0..1000.0, foreach(I in 1..N) % <, , dx, dy> in edges % r*sqrt(dx^2 + dy^2) <= dy*(x - x1) - dx*(y - y1) X1 #= Edges[I,1]*1.0, Y1 #= Edges[I,2]*1.0, X2 #= Edges[I,3]*1.0, Y2 #= Edges[I,4]*1.0, DX #= Edges[I,5]*1.0, DY #= Edges[I,6]*1.0, % Note: We must move sqrt() from the constraint DXDY = sqrt(DX*DX + DY*DY), R*DXDY #<= DY*(X - X1) - DX*(Y - Y1) end, solve($[max(R)],[R,X,Y]), println(r=R), println(x=X), println(y=Y), nl. go => true.