Помогите пожалуйста!!!!!
Мне надо написать программку,которая должна посчитать периметр и площадь треугольника имея только координаты трех точек (исходный массив),но при этом надо что бы было не только три точки может быть и больше,при этом должны перебираться все варианты,всех возможных треугольников,в конце должны появится два массива один с периметрами,второй с площадями,я просто в javaskrip:help: :help: :help: :help: :help:
|
Вы написали в раздел работа, так что укажите цену за эту работу.
|
marggooo1812, помоги мне помочь тебе...
|
Rise,
+)) |
marggooo1812, не берусь гарантировать, что код правильно работает на всех целых числах, ибо тестил только примитивные варианты.
Ну вы же не обозначили цену, т.ч. должны быть довольно говнокодом :) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ГГ</title> <style> </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> </head> <body> <label>x: </label> <input type="text" id="x"> <label>y: </label> <input type="text" id="y"> <input type="button" id="add" value="Добавить"> <input type="button" id="clear" value="Очистить" style="display:block; margin:20px;"> <input type="button" id="calc" value="Посчитать" style="display:block; margin:20px;"> <textarea id="output" rows="8" cols="40" style="display:block; margin:20px;">Периметры: | Площади:</textarea> <script> var add = document.querySelector('#add'), clear = document.querySelector('#clear'), calc = document.querySelector('#calc') textarea = document.querySelector('textarea'), x = document.getElementById('x'), y = document.getElementById('y'), points = []; function isInteger(num) { return (num ^ 0) === num; } function square(x){ return x*x; } add.onclick = function(){ if (isInteger(+x.value) && isInteger(+y.value)) { points.push({ 'x': x.value, 'y': y.value }); x.value = ""; y.value = ""; console.log(points); } else { alert('Введите обе координаты в виде целых чисел'); } } clear.onclick = function(){ points.length = 0; textarea.innerHTML = "Периметры: | Площади:"; } calc.onclick = function(){ if (points.length < 3) alert("Слишком мало точек чтобы образовать треугольник"); var p,s,l1,l2,l3; for (var i = 0; i < points.length; i++) { for (var j = 0; j < i; j++) { for (var k = 0; k < j; k++) { if ((points[i]["x"] - points[k]["x"]) * (points[j]["y"] - points[k]["y"]) - (points[j]["x"] - points[k]["x"]) * (points[i]["y"] - points[k]["y"]) == 0) continue; l1 = Math.sqrt(square(points[j]["x"] - points[i]["x"]) + square(points[j]["y"] - points[i]["y"])); l2 = Math.sqrt(square(points[k]["x"] - points[i]["x"]) + square(points[k]["y"] - points[i]["y"])); l3 = Math.sqrt(square(points[j]["x"] - points[k]["x"]) + square(points[j]["y"] - points[k]["y"])); console.log(l1); p = l1 + l2 + l3; console.log(p); ss = p/2 * (p/2 - l1) * (p/2 - l2) * (p/2 - l3); console.log(ss); s = Math.sqrt(ss); p = p.toFixed(2); s = s.toFixed(2); console.log(s); textarea.innerHTML += "\r\n" + p.toString() + " | " + s.toString(); } } } } </script> </body> </html> |
EmperioAf, надо еще на треугольник проверять, что из трех точек нет одинаковых и не лежат на одной прямой.
|
Цитата:
|
рони, чтобы не производить каждый раз весь цикл вычислений.
|
Цитата:
|
рони,
if ((points[i]["x"] - points[k]["x"]) / (points[j]["x"] - points[k]["x"]) == (points[i]["y"] - points[k]["y"]) / (points[j]["y"] - points[k]["y"])) continue; |
Rise,
спасибо, осталось с одинаковыми точками разобратся :) |
рони, наверное лучше без деления обойтись, а то неточные вычисления могут получиться при сравнении.
if ((points[i]["x"] - points[k]["x"]) * (points[j]["y"] - points[k]["y"]) - (points[j]["x"] - points[k]["x"]) * (points[i]["y"] - points[k]["y"]) == 0) continue; |
Rise,
:thanks: |
Цитата:
Я вообще думал добавить проверку на точки на одной прямой, но вспомнил, что в школе нам говорили что 3 точки на одной прямой тоже образуют треугольник; но у него один угол равен 180 градусов, а остальные два по нулям. |
var x = [0,1,0,6], y = [2,0,1,6], n = x.length; var sqrt = Math.sqrt, pow = Math.pow; var A, An = n - 2, AB, B, Bn = n - 1, BC, C, Cn = n - 0, CA, P, Pn = [], S, Sn = []; for (A = 0; A < An; A++) { for (B = A + 1; B < Bn; B++) { for (C = B + 1; C < Cn; C++) { if ((x[A] - x[C]) * (y[B] - y[C]) == (x[B] - x[C]) * (y[A] - y[C])) continue; AB = sqrt(pow(x[A] - x[B], 2) + pow(y[A] - y[B], 2)); BC = sqrt(pow(x[B] - x[C], 2) + pow(y[B] - y[C], 2)); CA = sqrt(pow(x[C] - x[A], 2) + pow(y[C] - y[A], 2)); P = AB + BC + CA; Pn.push(P); P /= 2; S = sqrt(P * (P - AB) * (P - BC) * (P - CA)); Sn.push(S); } } } console.table({P: Pn, S: Sn}); |
Rise,
:dance: |
рони, ;)
|
Часовой пояс GMT +3, время: 12:01. |