Javascript
Plot Complex Number Interpolation
this code is created first by chatGPT on Jan 29 2023 (meaning using chatGPT 3.5) and then modified a little bit my me. The initial request that I put into chatGPT is as follows :
|
Write a html and javascript with the following requirement
1. Use math.js library for math operations and assume that math.js file is located at mathjs/math.js 2. create a table at the center of the page. Gridlines of the table should be visible and thin. 3. the table has 4 rows and one column, make grid visible in thin line 4. In the first cell, put a textbox that can take in a number named as 'NoOfSample', the title of this text box is 'Number of Points' and a button named as 'Plot'. the default value of the text box is 10. Labels and text boxes should be on the same line. The input box should have spin button 5. In the second cell, put two textboxes that can take in A1 and t1 of the formula c1=A1*e^(i t1) where i denotes imaginary number. The default value of A1 = 0.5 and t1 = 30 in degree. Labels and text boxes should be on the same line. The input box should have spin button 6. In the third cell, put two textboxes that can take in A2 and t2 of the formula c2=A2*e^(i t2) where i denotes imaginary number. The default value of A1 = 1.5 and t1 = 270 in degree. Labels and text boxes should be on the same line. The input box should have spin button 7. In the fourth cell, put a canvas with the size of 400x400 pixel that plot the data in the file in the lower row. Do not put any background in the canvas. the background should be all white. 8. set the range of the canvas so that x axis range is '-2 <= x <= 2' and y axis range is '-2 <= x <= 2'. Use scale and translation method of canvas for this. 9. make the edge of the canvas visible 10. plot axis lines at (0,0) in the plot in black 11. write a function that returns an array of math.js complex numbers that interpolate from c1 and c2 with 'Number of Points'. The array show include both c1 and c2 and all the interpolated points. 12. write a function named plotInterpolation() that plot the complex array returned in previous step on the canvas when 'Plot' button is clicked. Real part of the complex number should be x coordinate and Imaginary part of the complex number should be y coordinate 13. javascript for the plot should be stored in a separate file 14. do not use css. 15. Create an html file that combines all of these components |
NOTE : It is not guaranteed that you would have the same code as I got since chatGPT produce the answers differently depending on the context. And it may produce the different answers everytime you ask even with the exact the same question.
NOTE : If you don't have any of your own idea for the request, copy my request and paste it into the chatGPT and put additional requests based on the output for the previous request. I would suggest to create a new thread in the chatGPT and put my request and then continue to add your own request.
Usage : Click on [Plot] button. When you change the contents of the input box using spin button, you will get the updated plot right away
|
ComplexInterpolate.html |
|
<!DOCTYPE html> <html>
<head> </head>
<body> <table align="center" style="border-collapse: collapse; border: thin solid;"> <tr> <td> <label for="NoOfSample">Number of Points:</label> <input type="number" id="NoOfSample" name="NoOfSample" min="1" value="10" onClick="plotInterpolation()" style="width: 50px;"> <button id="Plot" onClick="plotInterpolation()">Plot</button> </td> </tr> <tr> <td> <label for="A1">[Complex No. c1 = A1 e^(t1 j)] A1:</label> <input type="number" id="A1" name="A1" min="0" value="0.5" step="0.1" style="width: 50px;" onClick="plotInterpolation()"> <label for="t1">t1:</label> <input type="number" id="t1" name="t1" min="0" value="30" step="5" style="width: 50px;" onClick="plotInterpolation()"> </td> </tr> <tr> <td> <label for="A2">[Complex No. c2 = A2 e^(t2 j)] A2:</label> <input type="number" id="A2" name="A2" min="0" value="1.5" step="0.1" style="width: 50px;" onClick="plotInterpolation()"> <label for="t2">t2:</label> <input type="number" id="t2" name="t2" min="0" value="270" step="5" style="width: 50px;" onClick="plotInterpolation()"> </td> </tr> <tr> <td> <canvas id="plotCanvas" width="400" height="400" style="border: thin solid;"></canvas> </td> </tr> </table> <script src="mathjs/math.js"></script> <script src="PlotInterpolateComplex.js"></script> </body>
</html> |
NOTE : I downloaded the math.js library from Mathjs homepage and placed in local path : mathjs/math.js
NOTE : The canvas scaling was not done as expected. I would have spent long time to fix it, but I managed to fix it quickly based on the experience with this note.
|
PlotInterpolateComplex.js |
|
function plotInterpolation() { // get input values var numPoints = document.getElementById("NoOfSample").value; var A1 = document.getElementById("A1").value; var t1 = document.getElementById("t1").value; var A2 = document.getElementById("A2").value; var t2 = document.getElementById("t2").value;
// convert t1 and t2 from degrees to radians t1 = (t1 * Math.PI) / 180; t2 = (t2 * Math.PI) / 180;
// create c1 and c2 using input values var c1 = { r: A1, phi: t1 }; var c2 = { r: A2, phi: t2 };
// interpolate between c1 and c2 var interpolatedPoints = interpolate(c1, c2, numPoints);
// get canvas and context var canvas = document.getElementById("plotCanvas"); var ctx = canvas.getContext("2d");
// clear canvas ctx.clearRect(0, 0, canvas.width, canvas.height);
// set transform for scaling and translation //ctx.setTransform(1, 0, 0, -1, canvas.width/2, canvas.height/2);
// set range for x and y axis ctx.save(); ctx.lineWidth = 1/(canvas.width/4); ctx.scale(canvas.width / 4, -canvas.height / 4); ctx.translate(2, -2);
// draw axis lines ctx.beginPath(); ctx.moveTo(-2, 0); ctx.lineTo(2, 0); ctx.moveTo(0, -2); ctx.lineTo(0, 2); ctx.strokeStyle = "black"; ctx.stroke();
// plot interpolated points for (var i = 0; i < interpolatedPoints.length; i++) { var point = interpolatedPoints[i]; var x = point.r * Math.cos(point.phi); var y = point.r * Math.sin(point.phi); if (i==0) { ctx.fillStyle = "red"; } else if (i==interpolatedPoints.length-1) { ctx.fillStyle = "blue"; } else { ctx.fillStyle = "black"; }
ctx.beginPath(); ctx.arc(x, y, 0.04, 0, 2 * Math.PI); ctx.fill(); //console.log(x); }
ctx.restore(); }
function interpolate(c1, c2, numPoints) { var points = []; var step = 1 / (numPoints - 1); for (var i = 0; i < numPoints; i++) { var t = i * step; var r = parseFloat(c1.r) + (parseFloat(c2.r) - parseFloat(c1.r)) * t; var phi = c1.phi + (c2.phi - c1.phi) * t; points.push({ r: r, phi: phi }); } return points; } |