Функция:
void cDrawField::triangleDraw(double tmpx1, double tmpy1, double tmpx2, double tmpy2, double tmpx3, double tmpy3)
{
double tmpx4, tmpy4, tmpx5, tmpy5, tmpx6, tmpy6;
double sqt; // площадь
double a, b, c, p; // стороны и полупериметр
painter.drawLine(tmpx1, tmpy1, tmpx2, tmpy2);
painter.drawLine(tmpx2, tmpy2, tmpx3, tmpy3);
painter.drawLine(tmpx3, tmpy3, tmpx1, tmpy1);
tmpx4 = (tmpx1 + tmpx2) / 2;
tmpy4 = (tmpy1 + tmpy1) / 2;
tmpx5 = (tmpx2 + tmpx3) / 2;
tmpy5 = (tmpy2 + tmpy3) / 2;
tmpx6 = (tmpx1 + tmpx3) / 2;
tmpy6 = (tmpy1 + tmpy3) / 2;
a = sqrt(((tmpx4 - tmpx5) * (tmpx4 - tmpx5)) + ((tmpy4 - tmpy5) * (tmpy4 - tmpy5)));
b = sqrt(((tmpx5 - tmpx6) * (tmpx5 - tmpx6)) + ((tmpy5 - tmpy6) * (tmpy5 - tmpy6)));
c = sqrt(((tmpx6 - tmpx4) * (tmpx6 - tmpx4)) + ((tmpy6 - tmpy4) * (tmpy6 - tmpy4)));
p = (a + b + c) / 2;
sqt = sqrt((p - a) * (p - b) * (p - c));
if (sqt > 100)
{
triangleDraw(tmpx1, tmpy1, tmpx4, tmpy4, tmpx5, tmpy5);
triangleDraw(tmpx2, tmpy2, tmpx4, tmpy4, tmpx6, tmpy6);
triangleDraw(tmpx3, tmpy3, tmpx5, tmpy5, tmpx6, tmpy6);
triangleDraw(tmpx4, tmpy4, tmpx5, tmpy5, tmpx6, tmpy6);
}
}
ну видимо sqt не становится меньше 100
вообще код написан по татарски. Надо разбить на модель представление, то есть сначала рассчитать точки, а потом уже отобразить. А так сиди, разбирайся
почему то мне сдается что перед drawLine неплохо было бы курсор установить в нужное место, но это всего лишь мысль
Да вроде порядок кода нормальный, по-другому уже не то будет... Да и разбивать там особо-то нечего, ~10 строк всего.
А установка курсора что даст? Ведь drawLine проводит линию по полученным координатам, поэтому установка курсора здесь ничего не изменит (имхо).
вот функция:
function triangle_make(x1, y1, x2, y2, x3, y3, trid, trlevel) {
trlevel++;
// временно
//var eps = 10;
// объявляем объект для хранения данных о треугольнике
triangle = new Object();
//var triangle = new Object(); // переменная задана как глобальная, не объявляем локальную
// заполняем данными
triangle.id = trid; // должна быть переменная-счетчик вместо 1
triangle.level = trlevel; // должна быть переменная-счетчик вместо 1
triangle.x1 = x1;
triangle.y1 = y1;
triangle.x2 = x2;
triangle.y2 = y2;
triangle.x3 = x3;
triangle.y3 = y3;
// задаем массив для хранения данных о треугольниках
// var delta = new Array(); // массив задан как глобальный, не переопределяем локальный массив
// вносим данные о новом треугольнике
delta[trnumber] = triangle;
//alert('trid=' + trnumber + 'trlevel=' + trlevel);
// теперь обновим id
// строим главный треугольник
triangle_draw(x1, y1, x2, y2, x3, y3, 'triangle000');
// еще 3 вершины для следующего уровня
x1 = x1 * 1;
y1 = y1 * 1;
x2 = x2 * 1;
y2 = y2 * 1;
x3 = x3 * 1;
y3 = y3 * 1;
var x4 = (x1 + x2) / 2;
var y4 = (y1 + y2) / 2;
var x5 = (x1 + x3) / 2;
var y5 = (y1 + y3) / 2;
var x6 = (x2 + x3) / 2;
var y6 = (y2 + y3) / 2;
trnumber = trnumber + 1;
//alert('x5=' + x5);
//triangle_draw(x4, y4, x5, y5, x6, y6, 'triangle000');
// проверяем на площадь
if (triangle_square(x4, y4, x5, y5, x6, y6) > eps) {
triangle_make(x1, y1, x4, y4, x5, y5, trnumber, trlevel);
triangle_make(x2, y2, x4, y4, x6, y6, trnumber, trlevel);
triangle_make(x3, y3, x5, y5, x6, y6, trnumber, trlevel);
triangle_make(x4, y4, x5, y5, x6, y6, trnumber, trlevel);
//} else {
// делаем раскрывающийся список со всеми треугольниками
//triangleselect(trnumber);
}
}
У меня есть подозрение, что проблема в смешивании операций целочисленных типов данных с плавающей запятой. Там где 2, лучше сделать 2.0, где 100 - 100.0. Т.к. в некоторых случаях компилятор может считать 2 - 1.999..., 100 -99.999....
Попробовал так.. Тоже не помогло.
Там суть в том, что рекурсия идет, но не по всем вызовам.
Конкретно ошибка в этом участке
if (sqt > 100)
{
triangleDraw(tmpx1, tmpy1, tmpx4, tmpy4, tmpx5, tmpy5);
triangleDraw(tmpx2, tmpy2, tmpx4, tmpy4, tmpx6, tmpy6);
triangleDraw(tmpx3, tmpy3, tmpx5, tmpy5, tmpx6, tmpy6);
triangleDraw(tmpx4, tmpy4, tmpx5, tmpy5, tmpx6, tmpy6);
}
Одну опечатку нашел)
tmpy4 = (tmpy1 + tmpy1) / 2;
tmpy4 = (tmpy1 + tmpy2) / 2;
if (sqt > 100)
{
/* triangleDraw(tmpx1, tmpy1, tmpx4, tmpy4, tmpx5, tmpy5);
triangleDraw(tmpx2, tmpy2, tmpx4, tmpy4, tmpx6, tmpy6);
triangleDraw(tmpx3, tmpy3, tmpx5, tmpy5, tmpx6, tmpy6);
triangleDraw(tmpx4, tmpy4, tmpx5, tmpy5, tmpx6, tmpy6);
*/
triangleDraw(tmpx1, tmpy1, tmpx4, tmpy4, tmpx6, tmpy6);
triangleDraw(tmpx2, tmpy2, tmpx4, tmpy4, tmpx5, tmpy5);
triangleDraw(tmpx3, tmpy3, tmpx5, tmpy5, tmpx6, tmpy6);
triangleDraw(tmpx4, tmpy4, tmpx5, tmpy5, tmpx6, tmpy6);
}
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)