
Odbicie względem prostej nie przechodzącej przez punkt (0,0)
Użyty został skrypt transform.js.
Przypadek 2
Prosta nie jest równoległa do osi Y i może być przedstawiona równaniem y=mx+b
Prosta przechodzi przez dwa punkty (160,0) i (260,250).
tgφ=250/100=2,5=m;
Równanie prostej to y=2.5x-400, czyli b=-400
Listing
var cv = document.getElementById("canvas");
var ctx = cv.getContext("2d");
ctx.beginPath();
ctx.moveTo(160,0);
ctx.lineTo(260,250);
ctx.strokeStyle = "black";
ctx.stroke();
var leftX = 220;
var topY = 20;
var width = 100;
var height = 75;
var cornerRadius = 15;
drawRectangle(ctx);
Wykonujemy kolejne kroki:
translacja figury o współczynnik b/m=-400/2.5=-160
Prosta przechodzi teraz przez punkt (0,0).
Listing
var cv = document.getElementById("canvas1");
var ctx = cv.getContext("2d");
ctx.save();
ctx.beginPath();
ctx.translate(-160,0);
ctx.moveTo(160,0);
ctx.lineTo(260,250);
ctx.strokeStyle = "black";
ctx.stroke();
ctx.restore();
var leftX = 220;
var topY = 20;
var width = 100;
var height = 75;
var cornerRadius = 15;
ctx.translate(-160,0);
drawRectangle(ctx);
odbicie figury względem przesuniętej linii
Macierz odbicia wygląda tak:
,
gdzie φ jest kątem pod jakim prosta przecina oś X.
Listing
var cv = document.getElementById("canvas2");
var ctx = cv.getContext("2d");
ctx.save();
ctx.beginPath();
ctx.translate(-160,0);
ctx.moveTo(160,0);
ctx.lineTo(260,250);
ctx.strokeStyle = "black";
ctx.stroke();
ctx.restore();
var leftX = 220;
var topY = 20;
var width = 100;
var height = 75;
var cornerRadius = 15;
ctx.transform(Math.cos(2*Math.atan(2.5)),Math.sin(2*Math.atan(2.5)),Math.sin(2*Math.atan(2.5)),-Math.cos(2*Math.atan(2.5)),0,0);
ctx.translate(-160,0);
drawRectangle(ctx);
translacja powrotna
Listing
var cv = document.getElementById("canvas3");
var ctx = cv.getContext("2d");
ctx.save();
ctx.beginPath();
ctx.moveTo(160,0);
ctx.lineTo(260,250);
ctx.strokeStyle = "black";
ctx.stroke();
ctx.restore();
var leftX = 220;
var topY = 20;
var width = 100;
var height = 75;
var cornerRadius = 15;
ctx.translate(160,0);
ctx.transform(Math.cos(2*Math.atan(2.5)),Math.sin(2*Math.atan(2.5)),Math.sin(2*Math.atan(2.5)),-Math.cos(2*Math.atan(2.5)),0,0);
ctx.translate(-160,0);
drawRectangle(ctx);
