90 * randRange(1, 3) ROTDEG * PI / 180 Geom.convexhull(_.map(randRange(-4,4,6,2),function(e){return{x:e[0],y:e[1]}})) _.map(HULL, function(p) { return [p.x, p.y]; }) _.map(HULL,function(e){return[e.x*cos(ROTRAD)-e.y*sin(ROTRAD),e.x*sin(ROTRAD)+e.y*cos(ROTRAD)]})

¿Cuál es la imagen del polígono siguiente después de la rotación T_{{ROTDEG}^\circ{} }?

graphInit({range:11,scale:20,axisArrows:"<->",tickStep:1,labelStep:1,gridOpacity:.05,axisOpacity:.2,tickOpacity:.4,labelOpacity:.5}),addMouseLayer(),path(HULL_POINTS.concat(!0),{stroke:GRAY,strokeDasharray:"- "}),graph.points=_.map(HULL_POINTS,function(e){return addMovablePoint({coord:e})}),graph.lines=[],_(graph.points.length).times(function(e){graph.lines.push(addMovableLineSegment({pointA:graph.points[e],pointZ:graph.points[(e+1)%graph.points.length],fixed:!0}))}),graph.origOffsets=_.map(graph.points,function(e){return atan2(e.coord[1],e.coord[0])-roundToNearest(PI/6,atan2(e.coord[1],e.coord[0]))}),_.each(graph.points,function(e){e.onMove=function(e,t){var n=atan2(this.coord[1],this.coord[0]),s=atan2(t,e);return graph.updatePolygon(s-n),!1},e.onMoveEnd=function(e,t){var n=[graph.origOffsets[_.indexOf(graph.points,this)]+roundToNearest(PI/6,atan2(t,e))-atan2(this.coord[1],this.coord[0]),graph.origOffsets[_.indexOf(graph.points,this)]+roundToNearest(PI/6,atan2(t,e))+PI/6-atan2(this.coord[1],this.coord[0]),graph.origOffsets[_.indexOf(graph.points,this)]+roundToNearest(PI/6,atan2(t,e))-PI/6-atan2(this.coord[1],this.coord[0])],s=_.map(n,function(e){return abs(e)}),r=min(s[0],s[1],s[2]),a=_.find(n,function(e){return abs(e)===r});graph.updatePolygon(a)}}),graph.updatePolygon=function(e){_.each(graph.points,function(t){t.setCoord([t.coord[0]*cos(e)-t.coord[1]*sin(e),t.coord[0]*sin(e)+t.coord[1]*cos(e)]),t.updateLineEnds()})}
Rota el polígono azul hasta su imagen bajo la traslación dada.
_.map(graph.points,function(e){return e.coord})
var e=function(e,t){return e=_.sortBy(e,function(e){return 100*e[0]+e[1]}),t=_.sortBy(t,function(e){return 100*e[0]+e[1]}),_.all(e,function(n,s){return abs(e[s][0]-t[s][0])<.01&&abs(e[s][1]-t[s][1])<.01})};return e(guess,HULL_POINTS)?"":e(guess,TARGET)
_.each(graph.points,function(e,t){e.setCoord(guess[t]),e.updateLineEnds()})

Una rotación T_{\LARGE r^\circ{}} rota los puntos r grados al rededor de (0,0) al contrario de las manecillas del reloj.

Para ver cómo movió una rotación al polígono, elige un ponto y rótalo. Por ejemplo, ¿qué pasó con ( HULL[0].x , HULL[0].y ) con esta rotación?

circle([HULL[0].x,HULL[0].y],{r:.2,fill:"black",stroke:"none"})

Bajo la rotación T_{ROTDEG {}^\circ{} }, ( HULL[0].x , HULL[0].y ) se traslada a ( round(TARGET[0][0]) , round(TARGET[0][1])). ¿Hacia dónde rota el resto del polígono?

circle(TARGET[0],{r:.2,fill:"black",stroke:"none"}),arc([0,0],sqrt(pow(HULL[0].x,2)+pow(HULL[0].y,2)),180*atan2(HULL[0].y,HULL[0].x)/PI,180*atan2(TARGET[0][1],TARGET[0][0])/PI,{stroke:"black",arrows:"->"})

Para ir de (HULL[0].x, HULL[0].y) a (round(TARGET[0][0]), round(TARGET[0][1])), lo rotamos ROTDEG{}^\circ{} en contra de las manecillas del reloj, o un cuarto de circunferencia. Para ir de (HULL[0].x, HULL[0].y) a (round(TARGET[0][0]), round(TARGET[0][1])), lo rotamos ROTDEG{}^\circ{} en contra de las manecillas del reloj, o media circunferencia. Para ir de (HULL[0].x, HULL[0].y) a (round(TARGET[0][0]), round(TARGET[0][1])), lo rotamos ROTDEG{}^\circ{} en contra de las manecillas del reloj, o tres cuartos de circunferencia.

El contorno anaranjado muestra dónde queda el polígono después de la traslación.

for(var i=0;i<TARGET.length;i++)line(TARGET[i],TARGET[(i+1)%TARGET.length],{stroke:ORANGE})

¿Cuál es la transformación que rota la figura azul a la figura anaranjada punteada?

graphInit({range:11,scale:20,axisArrows:"<->",tickStep:1,labelStep:1,gridOpacity:.05,axisOpacity:.2,tickOpacity:.4,labelOpacity:.5}),path(HULL_POINTS.concat(!0),{stroke:BLUE}),path(TARGET.concat(!0),{stroke:ORANGE,strokeDasharray:"- "})
{\LARGE T} function(guess, maxError) { var correct = false; var symmetries = _.map(Geom.rotationalSymmetries(HULL), function(rad) { return rad / PI * 180; }).concat(360); return _.any(symmetries, function(sym) { return abs((((guess - ROTDEG + sym) % 360) + 360 + 180) % 360 - 180) < maxError; }); } {}^\circ{}

Una rotación T_{\LARGE r^\circ{}} rota los puntos r grados al rededor de (0, 0) al contrario de las manecillas del reloj.

Para ver qué rotación movió al polígono azul, elige un punto y rótalo. Por ejemplo, ¿qué pasó con (HULL[0].x, HULL[0].y) con esta rotación?

circle([HULL[0].x,HULL[0].y],{r:.2,fill:"black",stroke:"none"})

Bajo esta rotación, (HULL[0].x, HULL[0].y) fue rotado a (round(TARGET[0][0]), round(TARGET[0][1])). ¿Qué te dice esto sobre la rotación usada?

circle(TARGET[0],{r:.2,fill:"black",stroke:"none"}),arc([0,0],sqrt(pow(HULL[0].x,2)+pow(HULL[0].y,2)),180*atan2(HULL[0].y,HULL[0].x)/PI,180*atan2(TARGET[0][1],TARGET[0][0])/PI,{stroke:"black",arrows:"->"})

Para ir de (HULL[0].x, HULL[0].y) a (round(TARGET[0][0]), round(TARGET[0][1])), lo rotamos alrededor de (0, 0) ROTDEG{}^\circ{} en contra de las manecillas del reloj.

La rotación usada fue T_{ROTDEG^\circ{}}.