Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2019, 16:33   #1
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
Вопрос [РЕШЕНО][JavaScript] Классическое обдуваемое дерево Пифагора на js

Решение: http://www.programmersforum.ru/showt...25#post1773647

здравствуйте! тут есть гуру геометрии? мне нужно построить классическое обдуваемое дерево Пифагора на js. просто классическое дерево (на равнобедренных прямоугольных треугольниках) я построил, а вот при изменении углов прямоугольного треугольника картинка не идет(
Код:
function drawRect(x, y, b, c) {
	ctx.beginPath();
	ctx.moveTo(x, y);
	ctx.lineTo(x + Math.round(b * Math.cos(c)), y - Math.round(b * Math.sin(c)));
	ctx.lineTo(x + Math.round(b * Math.sqrt(2) * Math.cos(c + Math.PI / 4)), y - Math.round(b * Math.sqrt(2) * Math.sin(c + Math.PI / 4)));
	ctx.lineTo(x + Math.round(b * Math.cos(c + Math.PI / 2)), y - Math.round(b * Math.sin(c + Math.PI / 2)));
	ctx.lineTo(x, y);
	ctx.stroke();
	return;
}

function buildClassic(x, y, min, max, lan, ran, c) {
	if (max > min) {
		drawRect(Math.round(x), Math.round(y), Math.round(max), c);
		var x1 = x - max * Math.sin(c),
		y1 = y - max * Math.cos(c);
		drawRect(Math.round(x1), Math.round(y1), Math.round(max * Math.cos(lan * degree)), c + lan * degree);
		var x2 = x + max * Math.cos(c) + max * Math.sin(c) - max * Math.cos(ran * degree) * Math.cos(c + ran * degree),
		y2 = y - max * Math.sin(c) - max * Math.cos(c) - max * Math.cos(ran * degree) * Math.sin(c + ran * degree);
		buildClassic(Math.round(x2), Math.round(y2), min, Math.round(max * Math.cos(ran * degree)), lan, ran, c - ran * degree);
//		buildClassic(x - max * Math.sin(c), y - max * Math.cos(c), min, max * Math.cos(lan * degree), lan, ran, c + lan * degree);
//		buildClassic(x - max * Math.sin(c) + max * Math.cos(ran * degree) * Math.cos(c + ran * degree), y - max * Math.cos(c) - max * Math.cos(ran * degree) * Math.sin(c + ran * degree), min, max * Math.cos(ran * degree), lan, ran, c - ran * degree);
	}
	return;
}
объясняю, что к чему. те две строки, которые у меня закомментированы во второй функции, правильно строят классическое дерево Пифагора. но при изменении углов, как я уже говорил, картинка меняется (при том, что левая часть дерева рассчитывается верно при любых углах, а правая - нет). так вот. то что я сейчас пишу в функции (там еще не доделано, в процессе), так же правильно рисует левую часть (если запустить рекурсию) при любых углах. а вот с правой частью проблемы. я добился того, что оно рисует правильно первый проход при любых углах, а вот дальше координаты улетают в космос. я уверен, что вся проблема в координатах х2 и у2. подскажите, пожалуйста, как их правильно рассчитать
вот ссылка на песочницу, чтоб было наглядней: https://jsfiddle.net/Alexey9912/p2b3un0z/11/
там уже запущен тестовый пример

я понимаю что это не совсем программирование, но просто уже два дня с этой проблемой сижу и не у кого спросить. может нужно вообще другую методику построения применять. буду благодарен, если поможете разобраться с проблемой

ps. degree - это pi/180

Последний раз редактировалось Вадим Мошев; 23.03.2019 в 22:24.
Алексей9912 вне форума Ответить с цитированием
Старый 23.03.2019, 18:00   #2
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

все, спасибо за помощь, я исправил ошибку
Алексей9912 вне форума Ответить с цитированием
Старый 23.03.2019, 18:20   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Алексей9912, Если вы решили проблему, то расскажите о том, как вы это сделали. Это будет полезно остальным.
Вадим Мошев вне форума Ответить с цитированием
Старый 23.03.2019, 18:33   #4
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

Код:
function buildClassic(x, y, min, max, lan, ran, c) {
	if (max > min) {
		drawRect(Math.round(x), Math.round(y), Math.round(max), c);
		buildClassic(x - max * Math.sin(c), y - max * Math.cos(c), min, max * Math.cos(lan * degree), lan, ran, c + lan * degree);
		buildClassic(x - max * Math.sin(c) + max * Math.cos(lan * degree) * Math.cos(c + lan * degree), y - max * Math.cos(c) - max * Math.cos(lan * degree) * Math.sin(c + lan * degree), min, max * Math.cos(ran * degree), lan, ran, c - ran * degree);
	}
	return;
}
вот работающая функция для любых углов
Алексей9912 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Вывести таблицу Пифагора в виде матрицы 10 X 10. Каждый элемент матрицы в таблице Пифагора вычисляется по формуле а= i * j. dimadon456 Помощь студентам 0 08.05.2017 21:24
Очень нужно немного подправить код !Таблица Пифагора, Javascript. OlgaRostov JavaScript, Ajax 1 25.11.2015 16:10
JavaScript Таблица Пифагора revaldo666 JavaScript, Ajax 2 04.05.2012 02:18
Фрактал Дерево Пифагора Delphi yulia Помощь студентам 2 25.09.2008 08:27