Не могу вывести рекурсию по фигуре [закрыт]

163
03 февраля 2020, 23:10
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском».

Закрыт 10 месяцев назад.

Задача: Изобразить следующий фрактал

Насколько я понял, суть заключается в пятиугольниках. Создаётся пятиугольник, затем его более увеличенная версия, внутри которой находится 5 штук более мелких и т.д. А звезда формируется само собой.
Допустим создать пятиугольник, или же 5 пятиугольников вокруг 1 точки - не проблема, но как это сделать рекурсией, да ещё и как на рисунке - ума не приложу

Answer 1

Предположу что:

  1. На первой итерации рисуется отрезок и пятиугольник лежащий одним ребром на нем по центру одно ребро пятиугольника равно трети исходного отрезка

  1. На второй итерации 7 отрезков полученных в пункте 1 подвергается процедуре в описанной пункте 1, тут важен порядок обхода.

  1. повторяем процедуру рекурсивно сколько нужно раз

  2. Profit

интересная ссылка

P.S: вот результат четырех итераций предложенного мной алгоритма

А вот и сам алгоритм, я его расширил чтобы можно было рисовать родственные фракталы

<input id="shape" type="range" min="3" max="9" value="5" onchange="draw()"> 
<input id="iterarions" type="range" min="1" max="5" value="3" onchange="draw()"> 
<span></span><br> 
<canvas width=1000 height=600 style="height:80vh"></canvas> 
<script> 
let canvas = document.querySelector('canvas'); 
let ctx = canvas.getContext('2d'); 
draw(); 
 
function draw() { 
    ctx.clearRect(0,0,canvas.width, canvas.height); 
    let t = new Date().getTime(); 
    let lines = fractal([[[10, 599], [980, 599]]], 0); 
    lines.forEach(l => drawLine(l[0], l[1])) 
    t = new Date().getTime() - t; 
    document.querySelector('span') 
        .textContent = ' segments: '+lines.length+', time ' + t +' ms'; 
} 
 
function fractal(bases, i) { 
    if (i === +document.querySelector('#iterarions').value)  
        return bases; 
    let n = +document.querySelector('#shape').value; 
    let cs = Math.cos((180*(n-2))*Math.PI/180/n); 
    let sn = Math.sin((180*(n-2))*Math.PI/180/n); 
    let result = []; 
    bases.forEach(base => { 
        let x0 = base[0][0], y0 = base[0][1]; 
        let x1 = base[1][0], y1 = base[1][1]; 
        let dx3 = x1/3-x0/3, dy3 = y1/3-y0/3; 
        let sublines = []; 
        sublines.push([[x0, y0], [x0+dx3, y0+dy3]]); 
        sublines.push([[x0+dx3, y0+dy3], [x0+dx3*2, y0+dy3*2]]); 
        for (var i=0; i<n-1; i++) 
            sublines.push(nextEdge(...sublines[sublines.length-1])); 
        sublines.push([[x0+dx3*2, y0+dy3*2], [x1, y1]]); 
        result = result.concat(sublines); 
    }) 
    return fractal(result,i+1); 
     
    function nextEdge(p1, p2) { 
        let x = p1[0]-p2[0]; 
        let y = p1[1]-p2[1]; 
        let px = x * cs - y * sn;  
        let py = x * sn + y * cs; 
        return [[p2[0],p2[1]], [p2[0]+px, p2[1]+py]]; 
    } 
} 
 
function drawLine(p1, p2){ 
    ctx.beginPath(); 
    ctx.moveTo(p1[0], p1[1]); 
    ctx.lineTo(p2[0], p2[1]); 
    ctx.stroke(); 
} 
</script>

READ ALSO
Как сделать POST запрос к Yandex Translate API?

Как сделать POST запрос к Yandex Translate API?

Это мой запросВыглядит как GET, верно? Проблема в том, что если я пытаюсь хоть один параметр запихнуть в Body, то запрос возвращает Bad Request

164
Сортировка объекта в javascript

Сортировка объекта в javascript

Есть такой объект:

179
Функция для записи данных в массив

Функция для записи данных в массив

Столкнулся с такой проблемойУ меня есть функция (для вопроса упростил ее очень сильно):

196