Создание калькулятора области геометрии JavaScript Geometry: интерактивный учебник разработчика 2025

Anh Quân
Creator
Оглавление
- Введение: Зачем строить геометрический калькулятор?
- Что мы построим
- Предварительные условия
- Понимание математики, стоящих за расчетами области
- Настройка проекта
- Реализация JavaScript
- Понимание ключевых компонентов
- Добавление расширенных функций
- Тестирование и проверка
- Оптимизация для мобильных устройств
- Дополнительные улучшения
- Практические приложения
- Заключение
- Ресурсы для дальнейшего обучения
Углубленное руководство по созданию собственного интерактивного геометрического калькулятора с использованием JavaScript, в комплекте с расчетами площади для простых и сложных многоугольников.
Введение: Зачем строить геометрический калькулятор?
Расчеты геометрии составляют основу многочисленных реальных приложений-от наземного обзора и архитектуры до разработки игр и географических информационных систем.Как разработчики, нам часто нужны надежные инструменты для расчета областей различных форм.В то время как есть много онлайн -калькуляторов, создав свои собственные предложения несколько преимуществ:
- Полная настройка в соответствии с вашими конкретными требованиями проекта
- Гибкость интеграции с вашими существующими веб -приложениями
- Возможность обучения, чтобы понять координатную геометрию и алгоритмическое мышление
- Улучшение портфеля для демонстрации ваших навыков JavaScript
В этом всеобъемлющем учебном пособии мы проведем процесс создания мощного интерактивного калькулятора области геометрии с использованием JavaScript.В конце концов, у вас будет полностью функциональное веб -приложение, которое точно рассчитывает область как простых, так и сложных полигонов, используя геометрию координат.
Что мы построим
Наш калькулятор геометрии будет:
- Позвольте пользователям вводить координаты многоугольника через интуитивно понятный интерфейс
- Рассчитайте области как для регулярных, так и для нерегулярных многоугольников
- Поддерживать несколько единиц измерения
- Визуализируйте фигуры с помощью холста HTML
- Обеспечить четкие, точные результаты с надлежащим округлением
- Работайте во всех основных браузерах и устройствах

Предварительный просмотр нашего окончательного калькулятора области геометрии JavaScript с интерактивным входом многоугольника
Предварительные условия
Чтобы следовать этим учебному пособию, вы должны иметь:
- Основное понимание HTML, CSS и JavaScript
- Знакомство с манипуляциями с DOM
- Текстовый редактор или IDE (против кода, возвышенного текста и т. Д.)
- Современный веб -браузер
- Необязательно: понимание оснований координат геометрии
Понимание математики, стоящих за расчетами области
Прежде чем погрузиться в код, давайте поймем математические принципы, которые питают наш геометрический калькулятор.
Формула шнурки для области многоугольника
Для расчета площади любого многоугольника (регулярного или нерегулярного) мы будем использовать формулу шнурки, также известную как формула инспектора или формулу области Гаусса.Этот мощный алгоритм работает для любого многоугольника, определяемого его вершинами, независимо от того, насколько сложной может быть форма.
Формула выражена как:
Area = 0.5 * |∑(x_i * y_(i+1) - x_(i+1) * y_i)|
Где:
x_i
andy_i
are the coordinates of the i-th vertex- Формула рассчитывает половину суммы перекрестных продуктов соседних вершин
- Абсолютное значение обеспечивает положительную область
Эта формула работает по «ходьбе» по периметру многоугольника, рассчитывая перекрестные продукты между последовательными точками.Когда мы суммируем их и делимся на 2, мы получаем область многоугольника.
Настройка проекта
Начнем с настройки основной структуры нашего геометрического калькулятора:
HTML -структура
Create a new file named index.html
with the following structure:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Geometry Area Calculator</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="calculator-container">
<h1>Geometry Area Calculator</h1>
<div class="input-section">
<h2>Enter Polygon Coordinates</h2>
<p>Click on the canvas to add points or enter them manually below.</p>
<div class="canvas-container">
<canvas id="polygon-canvas" width="400" height="400"></canvas>
<button id="clear-canvas">Clear Canvas</button>
</div>
<div class="manual-input">
<div class="coordinates-container" id="coordinates-list">
<div class="coordinate-pair">
<input type="number" placeholder="X1" class="x-coord">
<input type="number" placeholder="Y1" class="y-coord">
<button class="remove-point">×</button>
</div>
</div>
<button id="add-point">Add Point</button>
</div>
<div class="units-selection">
<label for="units">Measurement Units:</label>
<select id="units">
<option value="pixels">Pixels</option>
<option value="meters">Meters</option>
<option value="feet">Feet</option>
</select>
</div>
<button id="calculate-area">Calculate Area</button>
</div>
<div class="results-section" id="results">
<!-- Results will be displayed here -->
</div>
</div>
<script src="script.js"></script>
</body>
</html>
Стиль CSS
Create a file named styles.css
for styling our calculator:
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background-color: #f5f5f5;
padding: 20px;
}
.calculator-container {
max-width: 800px;
margin: 0 auto;
background-color: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
}
h1 {
text-align: center;
color: #333;
margin-bottom: 30px;
}
h2 {
font-size: 1.5rem;
margin-bottom: 15px;
color: #444;
}
p {
margin-bottom: 20px;
color: #666;
}
.canvas-container {
margin-bottom: 30px;
text-align: center;
}
canvas {
border: 1px solid #ccc;
background-color: #f9f9f9;
}
.manual-input {
margin-bottom: 25px;
}
.coordinates-container {
max-height: 200px;
overflow-y: auto;
margin-bottom: 15px;
}
.coordinate-pair {
display: flex;
margin-bottom: 8px;
align-items: center;
}
input {
width: 80px;
padding: 8px;
margin-right: 10px;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
padding: 8px 15px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
button:hover {
background-color: #45a049;
}
.remove-point {
background-color: #f44336;
padding: 8px 12px;
}
.remove-point:hover {
background-color: #d32f2f;
}
#clear-canvas {
margin-top: 10px;
}
.units-selection {
margin-bottom: 25px;
}
select {
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
.results-section {
margin-top: 30px;
padding: 20px;
background-color: #f0f8ff;
border-radius: 6px;
display: none;
}
.results-section.active {
display: block;
}
.area-result {
font-size: 1.3rem;
margin-bottom: 15px;
}
.calculation-steps {
margin-top: 20px;
padding: 15px;
background-color: #f5f5f5;
border-radius: 4px;
font-family: monospace;
}
Реализация JavaScript
Now, let's create the script.js
file that will power our geometry area calculator:
// DOM Elements
const canvas = document.getElementById('polygon-canvas');
const ctx = canvas.getContext('2d');
const clearCanvasBtn = document.getElementById('clear-canvas');
const addPointBtn = document.getElementById('add-point');
const coordinatesList = document.getElementById('coordinates-list');
const calculateBtn = document.getElementById('calculate-area');
const resultsSection = document.getElementById('results');
const unitsSelect = document.getElementById('units');
// Global Variables
let points = [];
let isDragging = false;
let dragIndex = -1;
// Canvas Setup
function setupCanvas() {
// Set canvas coordinate system (origin at center)
ctx.translate(canvas.width / 2, canvas.height / 2);
drawGrid();
// Event listeners for canvas interaction
canvas.addEventListener('mousedown', handleMouseDown);
canvas.addEventListener('mousemove', handleMouseMove);
canvas.addEventListener('mouseup', () => isDragging = false);
// Redraw canvas initially
redrawCanvas();
}
// Draw coordinate grid
function drawGrid() {
const width = canvas.width;
const height = canvas.height;
ctx.strokeStyle = '#e0e0e0';
ctx.lineWidth = 1;
// Vertical lines
for (let x = -width/2; x <= width/2; x += 20) {
ctx.beginPath();
ctx.moveTo(x, -height/2);
ctx.lineTo(x, height/2);
ctx.stroke();
}
// Horizontal lines
for (let y = -height/2; y <= height/2; y += 20) {
ctx.beginPath();
ctx.moveTo(-width/2, y);
ctx.lineTo(width/2, y);
ctx.stroke();
}
// X and Y axes (darker)
ctx.strokeStyle = '#aaa';
ctx.lineWidth = 2;
// X-axis
ctx.beginPath();
ctx.moveTo(-width/2, 0);
ctx.lineTo(width/2, 0);
ctx.stroke();
// Y-axis
ctx.beginPath();
ctx.moveTo(0, -height/2);
ctx.lineTo(0, height/2);
ctx.stroke();
}
// Handle mouse down event on canvas
function handleMouseDown(e) {
const rect = canvas.getBoundingClientRect();
const scaleX = canvas.width / rect.width;
const scaleY = canvas.height / rect.height;
const canvasX = (e.clientX - rect.left) * scaleX - canvas.width / 2;
const canvasY = (e.clientY - rect.top) * scaleY - canvas.height / 2;
// Check if clicking near an existing point (for dragging)
for (let i = 0; i < points.length; i++) {
const dx = points[i].x - canvasX;
const dy = points[i].y - canvasY;
const distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 10) {
isDragging = true;
dragIndex = i;
return;
}
}
// If not dragging, add a new point
points.push({x: canvasX, y: canvasY});
updateCoordinateInputs();
redrawCanvas();
}
// Handle mouse move event on canvas
function handleMouseMove(e) {
if (!isDragging || dragIndex === -1) return;
const rect = canvas.getBoundingClientRect();
const scaleX = canvas.width / rect.width;
const scaleY = canvas.height / rect.height;
const canvasX = (e.clientX - rect.left) * scaleX - canvas.width / 2;
const canvasY = (e.clientY - rect.top) * scaleY - canvas.height / 2;
points[dragIndex] = {x: canvasX, y: canvasY};
updateCoordinateInputs();
redrawCanvas();
}
// Redraw the canvas with all points and connections
function redrawCanvas() {
// Clear the canvas
ctx.clearRect(-canvas.width/2, -canvas.height/2, canvas.width, canvas.height);
// Redraw the grid
drawGrid();
if (points.length === 0) return;
// Draw the polygon
ctx.beginPath();
ctx.moveTo(points[0].x, points[0].y);
for (let i = 1; i < points.length; i++) {
ctx.lineTo(points[i].x, points[i].y);
}
// Connect back to the first point if we have at least 3 points
if (points.length >= 3) {
ctx.lineTo(points[0].x, points[0].y);
// Fill the polygon with a semi-transparent color
ctx.fillStyle = 'rgba(76, 175, 80, 0.2)';
ctx.fill();
}
// Draw the polygon outline
ctx.strokeStyle = '#4CAF50';
ctx.lineWidth = 2;
ctx.stroke();
// Draw the points
for (let i = 0; i < points.length; i++) {
ctx.beginPath();
ctx.arc(points[i].x, points[i].y, 5, 0, Math.PI * 2);
ctx.fillStyle = '#4CAF50';
ctx.fill();
// Label the points
ctx.fillStyle = '#333';
ctx.font = '12px Arial';
ctx.fillText(`P${i+1}`, points[i].x + 8, points[i].y - 8);
}
}
// Update the coordinate inputs based on canvas points
function updateCoordinateInputs() {
// Clear all existing inputs
coordinatesList.innerHTML = '';
// Add new inputs for each point
for (let i = 0; i < points.length; i++) {
const pair = document.createElement('div');
pair.className = 'coordinate-pair';
const xInput = document.createElement('input');
xInput.type = 'number';
xInput.className = 'x-coord';
xInput.placeholder = `X${i+1}`;
xInput.value = Math.round(points[i].x);
xInput.dataset.index = i;
const yInput = document.createElement('input');
yInput.type = 'number';
yInput.className = 'y-coord';
yInput.placeholder = `Y${i+1}`;
yInput.value = Math.round(points[i].y);
yInput.dataset.index = i;
const removeBtn = document.createElement('button');
removeBtn.className = 'remove-point';
removeBtn.textContent = '×';
removeBtn.dataset.index = i;
pair.appendChild(xInput);
pair.appendChild(yInput);
pair.appendChild(removeBtn);
coordinatesList.appendChild(pair);
// Event listeners for manual input changes
xInput.addEventListener('change', updatePointFromInput);
yInput.addEventListener('change', updatePointFromInput);
removeBtn.addEventListener('click', removePoint);
}
}
// Update a point from manual input
function updatePointFromInput(e) {
const index = parseInt(e.target.dataset.index);
const value = parseFloat(e.target.value);
if (isNaN(value)) return;
if (e.target.className === 'x-coord') {
points[index].x = value;
} else {
points[index].y = value;
}
redrawCanvas();
}
// Remove a point
function removePoint(e) {
const index = parseInt(e.target.dataset.index);
points.splice(index, 1);
updateCoordinateInputs();
redrawCanvas();
}
// Add a new point via button
function addNewPoint() {
// Add a new point at (0, 0) or near the last point if one exists
if (points.length > 0) {
const lastPoint = points[points.length - 1];
points.push({x: lastPoint.x + 20, y: lastPoint.y + 20});
} else {
points.push({x: 0, y: 0});
}
updateCoordinateInputs();
redrawCanvas();
}
// Clear all points
function clearCanvas() {
points = [];
updateCoordinateInputs();
redrawCanvas();
resultsSection.style.display = 'none';
}
// Calculate area using the Shoelace formula
function calculatePolygonArea(vertices) {
if (vertices.length < 3) return 0;
let area = 0;
const n = vertices.length;
for (let i = 0; i < n; i++) {
const j = (i + 1) % n;
area += vertices[i].x * vertices[j].y;
area -= vertices[j].x * vertices[i].y;
}
return Math.abs(area / 2);
}
// Display the calculation results
function displayResults() {
if (points.length < 3) {
alert("You need at least 3 points to calculate area.");
return;
}
const area = calculatePolygonArea(points);
const selectedUnit = unitsSelect.value;
let unitSymbol = 'px²';
let convertedArea = area;
// Apply unit conversions if needed
if (selectedUnit === 'meters') {
unitSymbol = 'm²';
// Assuming 1 pixel = 0.01 meter for example
convertedArea = area * 0.0001;
} else if (selectedUnit === 'feet') {
unitSymbol = 'ft²';
// Assuming 1 pixel = 0.0328 feet
convertedArea = area * 0.001;
}
// Format the result
const formattedArea = convertedArea.toFixed(2);
// Create the result HTML
let resultHTML = `
<h2>Calculation Results</h2>
<div class="area-result">
<strong>Polygon Area:</strong> ${formattedArea} ${unitSymbol}
</div>
<p>Based on ${points.length} vertices</p>
<div class="calculation-steps">
<h3>Calculation Steps:</h3>
<p>Using the Shoelace formula: A = 0.5 × |∑(xᵢyᵢ₊₁ − xᵢ₊₁yᵢ)|</p>
<ol>
`;
// Add the calculation steps
for (let i = 0; i < points.length; i++) {
const j = (i + 1) % points.length;
const term = (points[i].x * points[j].y - points[j].x * points[i].y).toFixed(2);
resultHTML += `<li>Step ${i+1}: (${points[i].x} × ${points[j].y}) - (${points[j].x} × ${points[i].y}) = ${term}</li>`;
}
resultHTML += `
</ol>
<p>Summing all steps and taking absolute value: ${Math.abs(area).toFixed(2)}</p>
<p>Dividing by 2: ${(Math.abs(area)/2).toFixed(2)}</p>
</div>
`;
resultsSection.innerHTML = resultHTML;
resultsSection.style.display = 'block';
resultsSection.scrollIntoView({ behavior: 'smooth' });
}
// Initialize the application
function init() {
setupCanvas();
// Event listeners
clearCanvasBtn.addEventListener('click', clearCanvas);
addPointBtn.addEventListener('click', addNewPoint);
calculateBtn.addEventListener('click', displayResults);
}
// Start the app when the page loads
window.addEventListener('load', init);

Визуальное представление о том, как формула шнурки вычисляет площадь многоугольника
Понимание ключевых компонентов
Давайте разберем основные компоненты нашего калькулятора области геометрии:
Взаимодействие холста
Наш калькулятор использует элемент HTML Canvas для интерактивного создания многоугольника.Пользователи могут:
- Нажмите на холст, чтобы добавить баллы
- Перетащите существующие точки, чтобы регулировать позиции
- См. Визуализацию полигона в реальном времени
- Посмотреть сетку координат для справки
Canvas настроен с системой координат, где (0,0) находится в центре, что делает пользователями интуитивно понятным как с положительными, так и с отрицательными координатами.
Координировать управление вводами
Пользователи могут вводить координаты двумя способами:
- Визуальный ввод: нажмите непосредственно на холсте, чтобы разместить точки
- Ручной ввод: введите точные координаты в поля ввода
Два метода ввода синхронизируются, что позволяет как интуитивно понятное визуальное размещение, так и точный численный ввод.
Реализация алгоритма алгоритма
Ядром нашего калькулятора является реализация формулы шнурки:
function calculatePolygonArea(vertices) {
if (vertices.length < 3) return 0;
let area = 0;
const n = vertices.length;
for (let i = 0; i < n; i++) {
const j = (i + 1) % n;
area += vertices[i].x * vertices[j].y;
area -= vertices[j].x * vertices[i].y;
}
return Math.abs(area / 2);
}
Эта функция:
- Берет массив координат вершины
- Проходит через каждую точку и следующую точку (обернувшись к первой точке)
- Применяет расчет перекрестного продукта
- Берет абсолютную ценность и делит на 2, чтобы получить окончательную область
Красота этого алгоритма заключается в том, что он работает для любого многоугольника, независимо от того, выпуклый или вогнутый, если он не пересекается.
Добавление расширенных функций
Теперь, когда у нас работает базовый калькулятор, давайте расширим его с некоторыми расширенными функциями:
Конверсия единицы
Наш калькулятор поддерживает различные единицы измерения:
- Пиксели: для измерений на основе экрана
- Метры: для измерений в реальном мире
- Ноги: для имперских измерений
Преобразование устройства применяется после расчета площади:
// Apply unit conversions if needed
if (selectedUnit === 'meters') {
unitSymbol = 'm²';
// Assuming 1 pixel = 0.01 meter for example
convertedArea = area * 0.0001;
} else if (selectedUnit === 'feet') {
unitSymbol = 'ft²';
// Assuming 1 pixel = 0.0328 feet
convertedArea = area * 0.001;
}
Вы можете настроить коэффициенты конверсии на основе ваших конкретных требований.

Интерфейс калькулятора, показывающий параметры преобразования единиц для различных систем измерения
Подробные шаги расчета
Чтобы помочь пользователям понять, как рассчитывается область, мы предоставляем подробный разбивку шагов расчета:
// Add the calculation steps
for (let i = 0; i < points.length; i++) {
const j = (i + 1) % points.length;
const term = (points[i].x * points[j].y - points[j].x * points[i].y).toFixed(2);
resultHTML += `<li>Step ${i+1}: (${points[i].x} × ${points[j].y}) - (${points[j].x} × ${points[i].y}) = ${term}</li>`;
}
Эта прозрачность помогает пользователям проверить результаты и узнать о математических принципах, лежащих в основе расчетов области полигона.
Тестирование и проверка
Прежде чем рассмотреть наш калькулятор геометрии завершенным, давайте проверим его с некоторыми известными формами, чтобы проверить его точность:
Тестовый случай 1: прямоугольник
Простой прямоугольник с вершинами в (0,0), (100,0), (100,50) и (0,50) должен иметь площадь 5000 квадратных единиц.
Тестовый случай 2: треугольник
Треугольник с вершинами в (0,0), (50 100) и (100,0) должен иметь площадь 5000 квадратных единиц.
Тестовый случай 3: нерегулярный многоугольник
Нерегулярный многоугольник с вершинами в (0,0), (50 100), (100,50), (75,25) и (25,25) должен дать нам правильную область на основе формулы шнурки.
Для каждого тестового примера наш калькулятор должен:
- Разрешить легкий ввод тестовых координат
- Рассчитайте правильную область
- Отобразить шаги расчета для проверки
Оптимизация для мобильных устройств
Чтобы сделать наш калькулятор геометрии полностью отзывчивым, мы можем добавить следующие улучшения:
- Строка поддержки для взаимодействия холста
- Отзывчивый макет, который адаптируется к разным размерам экрана
- Упрощенный интерфейс для небольших экранов
Эти дополнения гарантируют, что наш калькулятор используется на смартфонах и планшетах, что делает его доступным для пользователей на всех устройствах.
Дополнительные улучшения
Чтобы сделать наш калькулятор области геометрии еще более надежным, рассмотрите возможность реализации этих дополнительных функций:
Предустановленные формы
Добавьте кнопки, чтобы быстро создать общие формы, такие как:
- Квадрат
- Прямоугольник
- Треугольник
- Круг (аппроксимирован как обычный многоугольник)
- Регулярные многоугольники (Пентагон, шестиугольник и т. Д.)
Расчет области для кругов
Расширить калькулятор, чтобы обработать области круга, используя:
function calculateCircleArea(radius) {
return Math.PI * radius * radius;
}
Расчет периметра
Добавьте функциональность для расчета периметра полигонов:
function calculatePolygonPerimeter(vertices) {
let perimeter = 0;
const n = vertices.length;
for (let i = 0; i < n; i++) {
const j = (i + 1) % n;
const dx = vertices[j].x - vertices[i].x;
const dy = vertices[j].y - vertices[i].y;
perimeter += Math.sqrt(dx * dx + dy * dy);
}
return perimeter;
}
Сохранение и загрузка многоугольников
Реализуйте LocalStorage для сохранения и загрузки конфигураций многоугольника:
// Save polygon
function savePolygon(name) {
const polygonData = JSON.stringify(points);
localStorage.setItem(`polygon_${name}`, polygonData);
}
// Load polygon
function loadPolygon(name) {
const polygonData = localStorage.getItem(`polygon_${name}`);
if (polygonData) {
points = JSON.parse(polygonData);
updateCoordinateInputs();
redrawCanvas();
}
}
Практические приложения

Различные реальные приложения, где калькуляторы области геометрии предоставляют ценные решения
Наш калькулятор области геометрии JavaScript имеет многочисленные практические применения:
Веб -разработка
- Интерактивные карты и визуализации сюжета
- Заявки на землю
- Инструменты планирования недвижимости
- Расположение номера и применения в дизайне
Образование
- Учебение геометрических принципов интерактивно
- Визуализация математических понятий
- Создание интерактивных учебных ресурсов
Разработка игры
- Обнаружение столкновений для игровых объектов
- Дизайн уровня и создание окружающей среды
- Процедурное поколение игровых миров
Заключение
В этом всеобъемлющем учебном пособии мы создали мощный, интерактивный калькулятор области геометрии с использованием JavaScript.Наш калькулятор может:
- Точно рассчитайте область любого многоугольника, используя формулу шнурки
- Предоставьте интуитивно понятный визуальный интерфейс для создания и изменения форм
- Руководство по поддержке ввода координат для точных измерений
- Преобразовать между различными единицами измерения
- Показать подробные шаги расчета в образовательных целях
Принципы и методы, которые мы рассмотрели - координатная геометрия, алгоритм шнурки, манипуляции с холстом и дизайн пользовательского интерфейса - являются ценными навыками, которые выходят за рамки этого конкретного проекта.Вы можете применить их к различным проблемам веб -разработки, от визуализации данных до интерактивных приложений.
Создавая этот калькулятор геометрии, вы не только создали полезный инструмент, но и углубили свое понимание математических концепций и их реализации в JavaScript.Не стесняйтесь расширять калькулятор с помощью дополнительных функций, оптимизировать его производительность или интегрировать его в свои собственные проекты.
Счастливого кодирования!