nascar
Новенький
Offline
|
|
« : 09-05-2011 17:03 » |
|
Привет всем! Мне тут задали написать программу, не могли бы вы....)))) правила https://forum.shelek.ru/index.php/topic,8855.0.html читал))) так вот суть в том чтоб на ассемблере написать программу типа авиа радара.... добрые люди помогли немного и сам немного поработал, но вот чет не получается немного... программа должна находить и подсвечивать точку, с чем она успешно справляется, но когда делаешь вторую точку, то она подсвечивается в то же время что и первая.... нужно сделать так чтоб они подсвечивались в разное время.....заранее спасибо org 100h mov ax,13h int 10h ;очищаем видеобуффер mov di,screen mov cx,16000 xor eax,eax rep stosd push 0A000h pop es ;устанавливаем палитру (63 градации зелёного) mov cx,127 @@:mov dx,3C8h mov ax,cx out dx,al inc dx xor al,al out dx,al cmp cx,63 cmc sbb ax,ax or ax,cx out dx,al xor al,al out dx,al loop @b fldz main:fadd [x] fld st0 fsincos fmul [aspectratio] ;чтобы получился круг нужно учитывать отношение высоты к ширине (240/320=0.75) fxch st1 ;рисуем линию fldz fldz mov cx,120 @@:fadd st0,st2 fist word[esp-4] fxch st1 fadd st0,st3 fist word[esp-2] fxch st1 imul di,[esp-2],320 add di,[esp-4] mov byte[screen+di+32160],63 mov si,6304 cmp di,-6304
jne skip
mov word[screen+di+32160+320],7F7Fh mov dword[screen+di+32160+639],7F7F7F7Fh mov dword[screen+di+32160+959],7F7F7F7Fh mov word[screen+di+32160+1280],7F7Fh
mov word[screen+si+32160+320],7f7Fh mov dword[screen+si+32160+639],7f7F7F7Fh mov dword[screen+si+32160+959],7f7F7F7Fh mov word[screen+si+32160+1280],7f7Fh skip: loop @b fstp st0 fstp st0 fstp st0 fstp st0 ;затухание цвета mov di,63999 @@:sub byte[screen+di],1 adc byte[screen+di],0 dec di jne @b ;ожидание обратного вертикального хода луча mov dx,3DAh @@:in al,dx test al,8 je @b ;копируем видеобуффер на экран mov si,screen xor di,di mov cx,16000 rep movsd ;если нажат escape - выход in al,60h dec al jne main ret x dd 0.007 aspectratio dd 0.75 screen:
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 09-05-2011 20:03 » |
|
nascar, тут либо нарушение синтаксиса, либо я что-то уже забыл: метки должны быть в начале строки, а не где угодно и, соотв., мнемоники не должны стоять в начале строки.
Предлагаю начать с алгоритма и описания задачи. Не мог бы ты описать это формулами? Ведь тут простая математика, а разбираться в движениях стека FPU - занятие муторное.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #2 : 09-05-2011 20:06 » |
|
Не, Ром, все верно... Это такой способ форматирования кода. (кстати, впервые вижу...)
затрудняюсь что-либо сказать по поводу @@:
loop @b
|
|
« Последнее редактирование: 09-05-2011 20:09 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 09-05-2011 20:19 » |
|
@@ - фишка, чтобы не придумывать имена меткам, когда они (имена) не имеют смысла. Соотв., @b - ближайшая метка @@ ниже (по адресу).
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
nascar
Новенький
Offline
|
|
« Ответ #4 : 10-05-2011 19:23 » |
|
ну я считаю что что нужно сначала описать метод прорисовки окружности.... допустим у нас есть окружность какого-то определенного адреса R и есть центр окружности, который расположен в центре экрана... ну в си это представляется как mid x и mid y ну назовем её Хо и Уо тогда нахождение точки на окружности рассчитывается по формуле { X=Xo+R*cos a ; Y=Yo+R*sin a} при 0<a<2pi. ну вот теперь нужно сделать цикл, который будет выполнятся от 0 до 2pi, то есть до 6.28, ну пусть с шагом 0.05... это 126 шагов.... ну вот как сделать так чтоб при пересечении линии которая находит на точку точка подсвечивалась.... ну и соответственно угасание постепенно.... простите пока еще не научился..... сорри если что нетак я только учусь....
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #5 : 10-05-2011 20:05 » |
|
Как по мне, есть ошибка в подходе к задаче.
Основная задача - обнаружение цели в пространстве Радар излучает сигнал и принимает отраженный.
Радар имеет дальность обнаружения цели - максимальный радиус. Как обнаружить цель?
Начнем с дальнего обнаружения цели. Нужно рассчитать количество точек на максимальном расстоянии, т.е длину максимальной окружности. И рисовать отрезок от центра до точки обнаружения. В случае появления сигнала - вывести на экран.
теперь описываем алгоритм
0 градусов Сигнал подан Ответ есть? Да - засветка Нет - увеличиваем угол, в данном случае на ... рассчитать дельту.
Недостаток приведенного алгоритма - не учтена волнообразная составляющая радио сигнала, также не учтены и лепестки излучения.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
nascar
Новенький
Offline
|
|
« Ответ #6 : 10-05-2011 20:18 » |
|
в общем идею вашу понял рисовать отрезок от центра до точки обнаружения. В случае появления сигнала - вывести на экран.
теперь описываем алгоритм
0 градусов Сигнал подан Ответ есть? Да - засветка Нет - увеличиваем угол, в данном случае на ... рассчитать дельту. думаю что углубляться в прочие подробности не имеет смысла, поскольку это не курсовой проект и не дипломная работа.... поэтому достаточно простой модели, которая бы вращала стрелку по кругу и обнаруживала объекты, которые подсвечиваются...
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 10-05-2011 21:28 » |
|
Хотя.... можно, и по другому, дабы не рассчитывать количество точек
Действовать по принципу волны Отправная точка - центр Рисуем окружность радиус 1 и так до максимальной.
Мне кажется так будет проще.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 11-05-2011 03:48 » |
|
nascar, в чем смысл задачи? Это анимация "под радар" или имитация настоящего радара? Подход разным будет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #9 : 11-05-2011 04:01 » |
|
RXL, анимация под радар.
nascar, ты C/C++ знаешь? Напиши решение, где вывод на экран, тест обратного хода луча и т.п. - ассемблер, а все остальные части (алгоритм решения) на C/C++. Псевдокод такой. Потом тебе помогут перевести алгоритм на ассемблер.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 11-05-2011 07:07 » |
|
Если вспомнить принцип отображения старых радаров, он основан на инерции люминофора. Вращающаяся линия имеет некую небольшую яркость. Точки "объектов" - яркие. Точки экрана за линией гаснут по некой формуле. Т.к. ближе к центру меньше точек, чем у края, то линия должна иметь градиент. Лучше даже будет, если линию заменить очень острым треугольником. Затухание яркости происходит для всех точек картинки. По моему разумению получается следующие действия в цикле: 1. Выполнить понижение яркости экрана. 2. Нарисовать треугольник с градиентом. Лучше всего, если будет не установка пикселей, а смешивание - случайно не сотрется "обнаруженный объект". 3. Если есть "объект", нарисовать его фрагмент в рамках того же треугольника. 4. Изменить угол линии.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #11 : 11-05-2011 08:40 » |
|
RXL, а по-моему тут нужен массив объектов. Что касается затухания, то его величина есть функция (например, линейная) от угла между объектом и сканирующим лучом. Останется только в каждом кадре менять угол луча и рисовать всё, исходя из угла.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sla
|
|
« Ответ #12 : 11-05-2011 09:09 » |
|
Почему мне не понравилось сканирование лучом? Нужно хранить координаты каждой точки максимальной окружности
Сканирование окружностью хранения этих данных не требует.
Засветку можно организовать след образом. Объект - точка (координаты, интенсивность) Вокруг точки - (координаты, интенсивность)
Таким образом Цель можно представить в виде множества точек(объектов)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
nascar
Новенький
Offline
|
|
« Ответ #13 : 11-05-2011 18:53 » |
|
эти идеи мне все нравятся.... и тот код что я выложил сначала для фасм мне подходит, единственное что мне нужно сделать 2 точки которые вовремя загораются... хотя все Ваши идеи интересны, но боюсь мне просто не хватит время на их реализацию((( фасм можно взять тут
|
|
« Последнее редактирование: 11-05-2011 20:59 от Джон »
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 11-05-2011 20:36 » |
|
nascar, просто прикладывай файлы к посту. Всякие публичные хранилища неудобны в принципе (тормозные) и через некоторое время удаляют файлы.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #15 : 11-05-2011 21:07 » |
|
но боюсь мне просто не хватит время на их реализацию(((
А я боюсь, что никто из нас за тебя эту работу делать не будет.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|