Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Срочно, помогите с исправлением функции) (https://javascript.ru/forum/dom-window/9494-srochno-pomogite-s-ispravleniem-funkcii.html)

Slawaq 20.05.2010 21:11

Срочно, помогите с исправлением функции)
 
от код яваскрипта чтобы нарисовать линию, в пиксельной таблице размером в 50на50
function crt_t(){
	var x = 50;
    var y = 50;
    var s = '<table width="1" border="0" cellspacing="0">';
    var id = '';
   for (var j = 1; j <= y; j++) {
  s += '<tr>';
  for (var i = 1; i <= x; i++) {
    var id = i+';'+j;
    s += '<td id="' + id + '" bgcolor="#009900" ></td>'
  }
  s += '</tr>';
}
s += '</table>';
document.getElementById('dd').innerHTML = s;
}

function line(x1,x2,y1,y2){
	xt = x1 + 1;
	n = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) ;
	k = (y2-y1)/(x2-x1);
	b = y2-k*x2;
	for (i=0;i<n;i++){ 
	yt=Math.round(k*xt+b);
	document.getElementById(xt+';'+yt).bgColor = 'black';
	xt = xt + 1;
	}
}


n - формула для нахождения отрезка, то есть его длину, и это есть количество точек, которое стоит между точками (х1;у1) и (х2;у2), то есть нам надо сделать далее цикл который и будет ставить эти точки, но нам надо найти теперь координаты этих точек, применяя формулу что
y = x*k + b, для прямолинейного отрезка, чтобы иметь эту формулу нам надо узнать k - угловой коэффициент и b - смещение, короче это будет система из уравнений, y1 = k*x1+b и y2 = k*x2+b но так как яваскрипт не решает системы из двух не известных, я ему сократил до
k = (y2-y1)/(x2-x1) де у нас x1,x2,y1,y2 >0 и подставивши это в уравнение прямой, b = y2 - k*x1 = y2 - (y2-y1)/(x2-x1)*x1.
и в конце оно просто добавляет по +1 к иксу и узнает у и его заливает), но линия может получаться немного не ровная или дето не будет зватать пкселей) или если задать line(49,35,45,25) так оно вообще нарисует точку, ОДНУ!) (49;45) и всё..) кто-мне может помочь с єтой функцией, не много , пожалуйста)

subzey 20.05.2010 22:50

Скажите, уважаемый, Вы язык, на котором пишете, знаете?

Slawaq 20.05.2010 23:08

ну...
да, как же по-другому, примерно 2 недели учил)))
но если серьезно что не так?)

subzey 20.05.2010 23:29

Судя по тому, что точки вообще ставятся, дело в функции line.
Кажется, у Вас неверные условия для цикла. Особенно смущает переменная n. Лучше перепроверьте - то ли она значит, что надо.

Slawaq 21.05.2010 00:19

ну смотри, n - это есть формула для нахождение отрезка между 2 точками, если известно их координаты, и пишется примерно так:
AB*AB = (X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2)
ну там все в квадрате, это ясно, и тогда расстояние отрезка и должно быть количеством точек, но при рисовании некоторых линий, линии бывают не соединении правильно. я от и хотел узнать почему же так... может там надо еще какие-то параметры..)

micscr 21.05.2010 08:22

Вот уже начинается....
Сначала выбирается неверная модель (большая пиксельная таблица для рисования) а потом начинаются попытки что то в ней сделать. Кое где(canvas), достаточно вызвать функцию line.
Прикольно будет когда эллипс тебе придется рисовать:) .

autosoft 21.05.2010 08:56

С теории нужно начинать.

Например, с этого:
Алгоритм_Брезенхэма

Slawaq 21.05.2010 08:58

Эллипс будет по такой же схеме, находим окружность, то есть количество точек, и с помощью цикла, ставим точке по формуле круга и всё, только мне надо правильно придумать если это будет уже реально эллипс, ну то есть искривлённый круг, от там надо будет подумать над коэффициентами..))
короче, а короче то что кажется зачем? но интересно ведь свою разработку делать!)
но как я понял, не кто не поможет с линией, значит будем экспериментировать и исправлять)

Kolyaj 21.05.2010 09:14

Цитата:

Сообщение от Slawaq
находим окружность, то есть количество точек, и с помощью цикла, ставим точке по формуле круга и всё

Это на непрерывном поле для рисования и всё, а на дискретном, как ваше, не всё.

Цитата:

Сообщение от Slawaq
не кто не поможет с линией

Вам уже дали то, с чего следовало начать.
Цитата:

Сообщение от autosoft
Например, с этого:
Алгоритм_Брезенхэма

Если уж вы хотите сами рисовать все примитивы, то придётся узнать, а как они вообще рисуются.

micscr 21.05.2010 11:44

Slawaq, колись - лаба, курсак или мышцы размять ? :)

Slawaq 22.05.2010 13:46

нет, не курсак)) и я сам нашел ошибку, там де у меня функция Math.round - там она не округляет тогда когда выходит в десятичной части 0.5, из-за этого есть пробелы точек)) то есть надо там поставить проверку на дробь и ставит +0.5 и все) а насчет курсака то не то просто интересно что-то новое поделать) тем более я только в 10 класс перешел) ну может только на МАН потянет):write:

Gvozd 22.05.2010 19:12

Цитата:

Сообщение от Slawaq
ну может только на МАН потянет

тогда пиши получше.
таблицы для рисования-не катят. для этого есть куча нормальных средств

Slawaq 23.05.2010 12:35

да, но дело состоит в том чтобы хоть что-то создать новое, зачем мне показывать то что есть? тем более таблица один раз создается и только тогда залагует, а потом все нормально работает, так что это как загрузка..)

Gvozd 23.05.2010 12:51

Цитата:

Сообщение от Slawaq
зачем мне показывать то что есть?

эм?
я что-то пропустил, и с каких-то пор целью МАНовской работы стало изобретение нового корявого велосипеда, взамен существующих, оправдавших себя технологий?!
вот стандартный вопрос, задающийся к любой работе на любом этапе:
Цитата:

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

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

Slawaq 23.05.2010 17:40

скорее мой руководитель это я, так как я еще не выбирал руководителя, и какие вообще могут быть руководители, если они нас Паскалю учат))) тем более район норм, Киев все-таки, но я буду работать для создания графического такого монитора, но в связке фреймов, или же через XMLHttpRequest будет проводиться управление графическим интерфейса с сервера, что позволит делать мощные страницы или приложение на подобие флешь, или лучше, но остаться проблема с построением такой громоздкой таблицы... вообще я думаю что то что я хочу сделать реально, только у меня опыта в этой деле из-за этого на выполнение этой задачи у меня будет уходить много времени, это того стоит))
конечно ты скажешь зачем такое делать если есть флешь, но это как сделать программу, сделать можно ее ведь разными языками программирования, в этом и следует создавать велосипед, чтобы он стал автомабилем. Такой интерфейс использование данных сервера может будет более преспективен чем флеш, надо попробовать))

Gvozd 23.05.2010 17:58

Цитата:

Сообщение от Slawaq
и какие вообще могут быть руководители, если они нас Паскалю учат

приди в отделение МАН, и пообщайся там.
может какой-то толковый преподаватель возьмет под крыло, если посчитает тебя хорошим учеником. Руководитель не обязан быть с твоей школы, или вообще школьным преподавателем.
Цитата:

Сообщение от Slawaq
на подобие флешь, или лучше

слишком много амбиций, для слишком херовой реализации.
то что ты хочешь сделать будет 100% проигрывать по скорости флешу, я уж не говорю об отсутствии огромного количества встроенных объектов, и хорошего редактора для рисования ручного
Цитата:

Сообщение от Slawaq
вообще я думаю что то что я хочу сделать реально

реально
и это будет реально медленно
Цитата:

Сообщение от Slawaq
это того стоит

нет
Цитата:

Сообщение от Slawaq
и следует создавать велосипед, чтобы он стал автомабилем

этот велосипед не станет автомобилем.
как минимум, пока он не сможет состязатся по скорости с флешем
это произойдет, когда процессоры станут на порядок-полтора быстрее, и сменится хотя бы одна полная версия основных браузеров, с полным пересмотром движка рендеринга и JS-интепретатора
PS
JS умеет рисовать не хуже флеша
Canvas/SVG + JS - хороший инструмент программной анимации, и рисования.
а вот то, что ты хочешь сделать-плохой инструмент

Slawaq 23.05.2010 18:03

***** все теперь точно буду делать)) спасибо за советы, особенно учту с пожеланиями на сверх скорость));)

Gvozd 23.05.2010 18:11

Slawaq,
ну, что ж.
дело твое. я пытался вразумить
но, если уж собираешься делать, то делай кроссбраузерно, и проверяй хотя бы в 4х актуальных браузерах, и в разных версиях.
я уверен, ты будешь "приятно" удивлен различной скоростью рендеринга, и сопутсвующими проблемами

а критерии к скорости очень простые:
на слабой машине должна быть возможность полностью(то есть изменить все "пиксели") перерисовывать кадр 25 раз в секунду, без тормозов, и с одинаковой скоростью во всех браузерах
ну и разумеется эта область рисования должна быть пристойных размеров.
хотя бы 1024*768

Slawaq 23.05.2010 18:31

насчет области, я думаю создать можно такую но надо будеть хорошо пересмотреть метод создание, тем более я посотрел что до пикселя не дотягивает ячейка)) но это уже другая тема, и так сильно вышли из-за рамок этой темы))

Gvozd 23.05.2010 18:34

Цитата:

Сообщение от Slawaq
тем более я посотрел что до пикселя не дотягивает ячейка))

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

Slawaq 23.05.2010 19:48

да, но это все я уже буду думаю делать когда лето начнется))


Часовой пояс GMT +3, время: 02:36.