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);