Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 3d на плоскости 
V
    Опции темы
piritus
Дата 26.6.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 3.1.2007
Где: Сибирь

Репутация: 1
Всего: 3



Здравствуйте.
Есть отрезок в пространстве. Его начальная точка совпадает с началом координат (x=0, y=0, z=0), 
конечная точка имеет координаты x=m, y=n, z=0. Нужно вращать отрезок вокруг оси z, т.е. z всегда равно 0.
При повороте отрезка вокруг оси OZ на определенный угол, координаты x и y будут меняться по следующей формуле:
x' = x*cos q - y*sin q
y' = x*sin q + y*cos q 
z' = z 

Следовательно матрица будет иметь следующий вид:
             ( cos q  sin q  0  0)
Rz (q) = (-sin q  cos q  0  0)
             ( 0        0    1  0)
             ( 0        0    0  1)

Можно использовать только LineTo (OpenGL и DirectX не использовать).

Вопрос:
Как обозначить точку в пространстве на плоскости, т.е. точку с координатами xyz в поле окна программы? (ведь там есть только x и y)

--------------------
PM MAIL ICQ   Вверх
AndNot
Дата 27.6.2009, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Есть два способа. Самый простой:
Xscr = X * ScreenDist / Z + ScrOriginX
Yscr = Y * ScreenDist / Z + ScrOriginY
в качестве дистанции частенько брали 256 (для fixed point), поэтому все расчеты сводились к:
ScrOriginX и ScrOriginY - это начало координат экрана (для оконных приложений), обычно равно нулю. Поэтому все вырождалось в:
Код
mov eax, [X]
mov ecx, [X]
cdq
shld edx, eax, 8 ; умножаем edx:eax на 256
shl eax, 8 ; завершаем умножение
idiv ecx ; (edx:eax * 256) / ecx (Z)

В EAX fixed point 8:8, т.е. в старшем байте - целое, а в младшем - "дробное".

Можно и через матрицы, но это лишние операции. Если интересно, то напишу как.
PM MAIL   Вверх
piritus
Дата 27.6.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 3.1.2007
Где: Сибирь

Репутация: 1
Всего: 3



Благодарю. Сейчас буду пробовать.
Было бы очень интересно посмотреть, как через матрицы высчитывать.
--------------------
PM MAIL ICQ   Вверх
piritus
Дата 4.7.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 3.1.2007
Где: Сибирь

Репутация: 1
Всего: 3



Не понял, как переводится из 3d в 2d по приведенной формуле.
Например:
user posted image
Дан куб, длина стороны L=55мм
Начало координат (x,y) совпадает с точкой О изометрии (x,y,z). 
Возьмем точку, лежащую на середине ближней грани куба, т.е. т(55;55;27,5).
Если подставить в формулу: 
Xscr = X * ScreenDist / Z + ScrOriginX
Yscr = Y * ScreenDist / Z + ScrOriginY
то получим, что  
Xscr = ScreenDist * 55/27,5
Yscr = ScreenDist * 55/27,5
т.е. Xscr == Yscr
Хотя на самом деле видно, что
Xscr = 0
Yscr = 27,5

Где ошибка?

Это сообщение отредактировал(а) piritus - 4.7.2009, 22:50
--------------------
PM MAIL ICQ   Вверх
Goodwin98
Дата 5.7.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 1.7.2009
Где: Deeptown

Репутация: 1
Всего: 5



Цитата

Возьмем точку, лежащую на середине ближней грани куба, т.е. т(55;55;27,5).

Судя по рисунку начальная координата Х не может быть 55 она так же 0, да и Z должен быть 19,44 , а не 27,5.

Это сообщение отредактировал(а) Goodwin98 - 5.7.2009, 16:00
PM MAIL ICQ   Вверх
piritus
Дата 5.7.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 3.1.2007
Где: Сибирь

Репутация: 1
Всего: 3



Вопрос решен, верное решение дали на васме.
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.