For A: BC = (0,0,0)
A is on the edge.
For B: BC = (0,0,0)
B is on the edge.
p
q
|
<head> <script type="text/javascript" src="prog.js"></script> </head> <body> <table> <tr><td> <canvas id="canvas" width=500 height=500 style="border:2px solid"></canvas> </td><td> <div id="AArea"> For A: BC = (0,0,0) A is on the edge. </div> <div id="BArea"> For B: BC = (0,0,0) B is on the edge. </div> p <div class="slidecontainer"> <input type="range" min="0" max="100" value="50" class="slider" onchange="ChangeP(this.value);"> </div> q <div class="slidecontainer"> <input type="range" min="0" max="100" value="50" class="slider" onchange="ChangeQ(this.value);"> </div> </td></tr> </table> <script> 'use strict' var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); ctx.transform(1,0,0,-1,0,canvas.height); var p = .5; var q = .5; function Redraw() { DrawTriangle(ctx, canvas.width, canvas.height); DrawPoints(ctx, p, q); } function ChangeP(paramP) { p = paramP/100; Redraw(); } function ChangeQ(paramQ) { q = paramQ/100; Redraw(); } Redraw(); </script> </body>
'use strict' const points = [ [10,10,0], [100,480,0],[ 450, 30,0]]; const bc = [[0,1,0], [1,0,0], [0,0,1]]; function Interp(s,e,p) { return s*(1-p) + e*p; } function InterpV (S, E, p) { let r = [] for(let i =0;i<3; i++) { r.push(Interp(S[i], E[i], p)); } return r; } function DrawTriangle(ctx, w,h) { ctx.clearRect(0,0, w, h); ctx.strokeStyle = "black"; ctx.beginPath(); ctx.moveTo(points[2][0], points[2][1]); for (let i = 0; i < 3; i++) { ctx.lineTo(points[i][0], points[i][1]); } ctx.stroke(); ctx.closePath(); return; } function Plot(ctc, pt, bc, up, color) { ctx.fillStyle = color; ctx.strokeStyle = color let text = "(" + bc[0].toFixed(2).toString() + ", " + bc[1].toFixed(2).toString() + ", " + bc[2].toFixed(2).toString() + ")" ctx.font = '20px sans-serif' ctx.save() ctx.scale(1,-1) ctx.beginPath() if (up) { ctx.strokeText(text, pt[0]+10, -pt[1]-10) } else { ctx.strokeText(text, pt[0]+10, -pt[1]+20) } ctx.stroke() ctx.restore() ctx.beginPath(); ctx.arc(pt[0], pt[1], 5, 0, 2*Math.PI); ctx.fill(); } function Line(ctx, a, b, color) { ctx.fillStroke = color ctx.beginPath() ctx.moveTo(a[0],a[1]) ctx.lineTo(b[0],b[1]) ctx.stroke() } function Edge(p, limit) { for(let i = 0; i < 3; i++) { if (p[i] < limit) { return true; } } return false; } function Log(id, name , pt) { let plus = ""; if (Edge(pt, 0.05)) { plus = " is on the edge"; } document.getElementById(id).innerText = ( name + " (" + pt[0].toFixed(2) + ", " + pt[1].toFixed(2) + ", " + pt[2].toFixed(2) + ")" + plus); } function DrawPoints(ctx, p,q) { let a = InterpV(points[0], points[1], p); let b = InterpV( points[2],a, q); let bcA = InterpV(bc[0], bc[1], p); let bcB = InterpV(bc[2], bcA, q); Log("AArea", "Blue", bcA); Log("BArea", "Red", bcB); Plot(ctx, a, bcA,true, "blue") Plot(ctx, b, bcB,false, "red") Line(ctx, a, b, "black") }