Показать сообщение отдельно
  #1 (permalink)  
Старый 23.12.2021, 12:29
Профессор
Отправить личное сообщение для Teamur Посмотреть профиль Найти все сообщения от Teamur
 
Регистрация: 08.06.2015
Сообщений: 206

Построение правильного многоугольника без тригонометрических функций
См. функцию poly :
<!DOCTYPE html>
<canvas id=c width=600 height=600 style='outline:1px solid'></canvas>
<script>
'use strict';
const cx=c.getContext('2d'), {PI,sin,cos,round}=Math,
pi2=PI*2,
ra=PI/180, // 1 радиан
ra90=90*ra,
 
line=(x1,y1,x2,y2)=>(cx.beginPath(),cx.moveTo(x1,y1),cx.lineTo(x2,y2),cx.stroke(),line),
cross=(x,y,d=20)=>(line(x-(d/=2),y,x+d,y)(x,y-d,x,y+d),cross),
circle=(x,y,d=20)=>(cx.beginPath(),cx.arc(x,y,d/2,0,pi2),cx.stroke(),circle),
 
poly=(x,y,d=20,n=4,a=-ra90)=>{ // a - первая вершина будет сверху холста
  if(n>2){ d/=2;
    cx.beginPath();
    for(let b=pi2/n++; n--; cx.lineTo( x+d*cos(a+=b), y+d*sin(a) ));
    cx.stroke()
  }
};
 
poly(300,300,400,8); // 400 - диаметр описанной окружности, 8 - количество вершин
 
cross(300,300); // центр правильного многоугольника
 
cx.strokeStyle='red'; // первая вершина
circle(300,100);
 
cx.strokeStyle='blue';
circle(300,300,400);
 
</script>

Возможно ли избавиться от sin и cos при построении многоугольника, если знать диаметр описанной окружности, количество вершин многоугольника?

Может здесь поможет векторная алгебра, всякие скалярные и векторные произведения.
Или как-то найти соотношение длины дуги описанной коружности к хорде, которая будет стороной многоугольника.
Получить равнобедренный треугольник и зная хорду и 2 стороны, равные диаметру, найти координаты вершин.
В общем я запутался, есть чувство, что можно обойтись без тригонометрии, хотя бы в цикле.

Одной из причин, которая сподвигла задать вопрос, был просмотр мною видео об истории числа ПИ, которые нашли разбиением окружности на сегменты. И чем больше сегментов, тем точнее ПИ.
И спрашивается можно ли вообще без него обойтись при построении правильного многоугольника и почему я должен разбивать окружность на 360 частей, если надо например только на 8, или скажем на 1000.
И вообще, возможно было бы удобно, представить длину окружности за единицу (нормализовать) и иметь дело с соотношениями сторон, координатами.

Также мне очень понравились статьи с хабра про векторную алгебру:
Избегаем тригонометрии :
https://habr.com/ru/post/462539/
Когда не нужна тригонометрия :
https://habr.com/ru/post/105882/

Надеюсь получится улучшить функцию poly и сделать её настолько быстрой, насколько возможно,
ведь так здорово когда всё работает быстро и без извращений )))

Последний раз редактировалось Teamur, 23.12.2021 в 12:31.
Ответить с цитированием