176 lines
5.5 KiB
JavaScript
176 lines
5.5 KiB
JavaScript
|
function submitForm() {
|
||
|
const x = document.getElementById('x').value;
|
||
|
const y = document.getElementById('y').value.trim();
|
||
|
const rElements = document.getElementsByName('r');
|
||
|
let r;
|
||
|
for (let i = 0; i < rElements.length; i++) {
|
||
|
if (rElements[i].checked) {
|
||
|
r = rElements[i].value;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Validate input
|
||
|
if (!validateInput(x, y, r)) {
|
||
|
alert("Некорректные данные");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Prepare data for POST request
|
||
|
const data = new URLSearchParams();
|
||
|
data.append('x', x);
|
||
|
data.append('y', y);
|
||
|
data.append('r', r);
|
||
|
|
||
|
// Send POST request using Fetch API
|
||
|
fetch('/fcgi-bin/', {
|
||
|
method: 'POST',
|
||
|
headers: {
|
||
|
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
|
||
|
},
|
||
|
body: data.toString(),
|
||
|
})
|
||
|
.then(response => response.json())
|
||
|
.then(result => {
|
||
|
if (result.error) {
|
||
|
alert("Ошибка сервера: " + result.error);
|
||
|
} else {
|
||
|
updateResults({
|
||
|
x: x,
|
||
|
y: y,
|
||
|
r: r,
|
||
|
hit: result.result,
|
||
|
timestamp: new Date().toLocaleString(),
|
||
|
executionTime: result.executionTime + ' ms' // Use executionTime from backend
|
||
|
});
|
||
|
drawPoint(x, y, r);
|
||
|
}
|
||
|
})
|
||
|
.catch(error => {
|
||
|
alert("Ошибка запроса: " + error);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function validateInput(x, y, r) {
|
||
|
const xValue = parseFloat(x);
|
||
|
const yValue = parseFloat(y.replace(',', '.'));
|
||
|
const rValue = parseFloat(r);
|
||
|
|
||
|
if (isNaN(xValue) || isNaN(yValue) || isNaN(rValue)) return false;
|
||
|
if (xValue < -5 || xValue > 3) return false;
|
||
|
if (yValue < -5 || yValue > 3) return false; // Ensure correct range for y
|
||
|
return [1, 1.5, 2, 2.5, 3].includes(rValue);
|
||
|
}
|
||
|
|
||
|
function updateResults(result) {
|
||
|
const table = document.getElementById('results');
|
||
|
const row = table.insertRow(1);
|
||
|
row.insertCell(0).innerText = result.x;
|
||
|
row.insertCell(1).innerText = result.y;
|
||
|
row.insertCell(2).innerText = result.r;
|
||
|
row.insertCell(3).innerText = result.hit ? 'Попадание' : 'Промах';
|
||
|
row.insertCell(4).innerText = result.timestamp;
|
||
|
row.insertCell(5).innerText = result.executionTime;
|
||
|
}
|
||
|
|
||
|
function drawPoint(x, y, r) {
|
||
|
const canvas = document.getElementById('canvas');
|
||
|
const ctx = canvas.getContext('2d');
|
||
|
const width = canvas.width;
|
||
|
const height = canvas.height;
|
||
|
const centerX = width / 2;
|
||
|
const centerY = height / 2;
|
||
|
const scale = (width / 2 - 40) / r;
|
||
|
|
||
|
const canvasX = centerX + x * scale;
|
||
|
const canvasY = centerY - y * scale;
|
||
|
|
||
|
ctx.beginPath();
|
||
|
ctx.arc(canvasX, canvasY, 3, 0, 2 * Math.PI);
|
||
|
ctx.fillStyle = 'red';
|
||
|
ctx.fill();
|
||
|
}
|
||
|
|
||
|
function drawGraph(r = 1) {
|
||
|
const canvas = document.getElementById('canvas');
|
||
|
const ctx = canvas.getContext('2d');
|
||
|
|
||
|
// Ensure the canvas is properly initialized
|
||
|
if (!canvas || !ctx) {
|
||
|
console.error('Canvas or context not found.');
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const width = canvas.width;
|
||
|
const height = canvas.height;
|
||
|
const centerX = width / 2;
|
||
|
const centerY = height / 2;
|
||
|
const scale = (width / 2 - 40) / r; // Ensure scale isn't too small
|
||
|
|
||
|
// Clear the canvas before drawing
|
||
|
ctx.clearRect(0, 0, width, height);
|
||
|
|
||
|
// Draw the axes
|
||
|
ctx.beginPath();
|
||
|
ctx.moveTo(0, centerY);
|
||
|
ctx.lineTo(width, centerY); // Horizontal axis
|
||
|
ctx.moveTo(centerX, 0);
|
||
|
ctx.lineTo(centerX, height); // Vertical axis
|
||
|
ctx.strokeStyle = 'black';
|
||
|
ctx.lineWidth = 2;
|
||
|
ctx.stroke();
|
||
|
|
||
|
// Draw R labels on axes
|
||
|
ctx.fillStyle = 'black';
|
||
|
ctx.font = '12px Arial';
|
||
|
|
||
|
// X-axis labels
|
||
|
ctx.fillText('R', centerX + r * scale, centerY - 5); // R
|
||
|
ctx.fillText('R/2', centerX + (r / 2) * scale, centerY - 5); // R/2
|
||
|
ctx.fillText('-R/2', centerX - (r / 2) * scale, centerY - 5); // -R/2
|
||
|
ctx.fillText('-R', centerX - r * scale, centerY - 5); // -R
|
||
|
|
||
|
// Y-axis labels
|
||
|
ctx.fillText('R', centerX + 5, centerY - r * scale); // R
|
||
|
ctx.fillText('R/2', centerX + 5, centerY - (r / 2) * scale); // R/2
|
||
|
ctx.fillText('-R/2', centerX + 5, centerY + (r / 2) * scale); // -R/2
|
||
|
ctx.fillText('-R', centerX + 5, centerY + r * scale); // -R
|
||
|
|
||
|
// Draw shapes based on R
|
||
|
ctx.fillStyle = 'rgba(0, 0, 255, 0.3)';
|
||
|
|
||
|
// Draw the rectangle (Top-left quadrant)
|
||
|
ctx.fillRect(centerX - (r / 2) * scale, centerY - r * scale, (r / 2) * scale, r * scale); // Rectangle from -R/2 to 0 on X and 0 to R on Y
|
||
|
|
||
|
// Draw the triangle (Bottom-left quadrant)
|
||
|
ctx.beginPath();
|
||
|
ctx.moveTo(centerX, centerY); // Center
|
||
|
ctx.lineTo(centerX - r * scale, centerY); // Left
|
||
|
ctx.lineTo(centerX, centerY + r * scale / 2);// Bottom
|
||
|
ctx.closePath();
|
||
|
ctx.fill();
|
||
|
|
||
|
// Correct Quarter Circle (Top-right quadrant)
|
||
|
ctx.beginPath();
|
||
|
ctx.moveTo(centerX, centerY); // Start from center
|
||
|
ctx.arc(centerX, centerY, r * scale, - Math.PI / 2, 0);// Quarter circle from 0 to R on both axes (top-right)
|
||
|
ctx.closePath();
|
||
|
ctx.fill();
|
||
|
|
||
|
console.log('Graph drawn with R =', r);
|
||
|
}
|
||
|
|
||
|
// Trigger drawGraph on page load or when R is changed
|
||
|
const rElements = document.getElementsByName('r');
|
||
|
rElements.forEach(radio => {
|
||
|
radio.addEventListener('change', () => {
|
||
|
const rValue = parseFloat(radio.value);
|
||
|
drawGraph(rValue);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
window.onload = function() {
|
||
|
drawGraph(); // Default R = 1
|
||
|
};
|
||
|
|