Russian Qt Forum
Ноябрь 24, 2024, 03:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Относительные величины  (Прочитано 6503 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 27, 2015, 08:36 »

Добрый день

Есть 3 простецких параметра "смещение" вдоль каждой из осей. Эти значения добавляются напр к позиции/центру текстуры на объекте. Проблема в том что не всегда удобно использовать абсолютные значения. Напр текстура была copy/paste с одного объекта на другой - и приходится всякий раз подгонять ее смещения к размерам нового объекта. Напрашивается использовать величины относительно размера объекта. Пример;

- размеры объекта 10x20x50
- относительное смещение (1, 0.2, 0.5) соответствует абсолютному (10, 4, 25).
- теперь размеры объекта могут меняться как угодно, текстура остается на месте

И все хорошо, но как быть если размеры текущего объекта нулевые (или достаточно малы) вдоль одной или двух осей Непонимающий  Чисто для включения зрительной памяти прилагаю скриншот  Улыбающийся

Спасибо

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Май 27, 2015, 12:19 »

Цитировать
если размеры текущего объекта нулевые (или достаточно малы) вдоль одной или двух осей

дизаблить поля ввода?
или что вообще требуется сделать?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 27, 2015, 12:33 »

дизаблить поля ввода?
или что вообще требуется сделать?
Ага, ага
Цитировать
Чего там думать, вникать - это ж надо хотя бы внимательно прочитать. Закину вопрос - пусть все разжует, в конце-концов ему надо а не мне
Racheengel, просьба воздух не гонять. Неясен вопрос - я как-нибудь проживу без Вашего ответа. Все Ваши последующие вопросы вынужден просто гонорировать. Спасибо за понимание.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Май 27, 2015, 21:16 »

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

ЗЫ. Чтобы получить ответ - надо сначала нормально задать вопрос. Тут же не телепаты сидят. А если вопрос задавать "просто так", не ожидая на него ответа - дык это не сюда...

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Июнь 11, 2015, 00:24 »

Igors, я не злорадствую и не люблю этого, но - где же ответы? А может, просто вопроса никто не понял? Может же такое быть?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #5 : Июнь 11, 2015, 01:12 »

Просто вопроса в сообщении ТСса нет, он где то в его мыслях остался.
Отвечать не на что.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 11, 2015, 10:56 »

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

Есть окно размером 320x240 и в нем есть точка в позиции (100, 100). Я хочу хранить эту точку в относительных координатах QPointF(100 / 320.0, 100 / 240.0). Теперь если пользователь ресайзит окно я легко пересчитаю свою точку под новый размер окна. Такие вопросы не раз задавались начинающими.

В первом посте все то же самое только 3 измерения вместо 2. Вопрос как отрабатывать крайний случай. Это QImage не может иметь нулевые ширину/высоту, а 3D объект запросто может. Что тогда с относительными величинами, ведь делить на ноль низзя? Ну или не чистый ноль но какое-то мерзкое 1.0e-15

Вряд ли здесь "что-то непонятно". Просто нужно думать самому, а с готовыми удобными классами так не хочется Улыбающийся Вот если бы это было в букваре..... а так, какой-то "крайний случай" - та ну его, пусть сам разбирается. И вообще вопроса не было (как сказал набежавший хвостик  Улыбающийся)
« Последнее редактирование: Июнь 11, 2015, 10:58 от Igors » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Июнь 11, 2015, 11:42 »

Ок, теперь понятно Улыбающийся Ну насколько я вижу - "крайний случай" - это бесконечно малый размер объекта, стремящийся к нулю. Я бы подобное дело опрашивал, сравнивая размеры по каждой из оси с какой-нибудь "дельтой", к примеру 0.01 или что там для Вас допустимо. Если размер меньше дельты - то координату точки приравнивать к 0 (иначе все равно не имеет смысл ее вычислять по причине невидимости).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 12, 2015, 11:41 »

Ок, теперь понятно Улыбающийся Ну насколько я вижу - "крайний случай" - это бесконечно малый размер объекта, стремящийся к нулю. Я бы подобное дело опрашивал, сравнивая размеры по каждой из оси с какой-нибудь "дельтой", к примеру 0.01 или что там для Вас допустимо. Если размер меньше дельты - то координату точки приравнивать к 0 (иначе все равно не имеет смысл ее вычислять по причине невидимости).
Ну так не выходит. Напр размер бокса (x=0.000, y=5, z=5). Вид в проекции XY
Цитировать
|
|        *
|
|
Точка (звездочка) имеет X координату, пользователь может ее менять. А вот размер объекта вдоль оси X нулевой или близкий к нему - хотя это совершенно нормальный объект (плоскость стоящая ребром)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Июнь 12, 2015, 13:35 »

Что-то не так здесь. Насколько я понимаю, точка должна принадлежать объекту (т.е. быть внутри него либо лежать на поверхности). Если размер бокса по x=0.000, то локальная координата точки x тоже должна быть вычислена как 0.000 (независимо от ее заданного относительного смещения), иначе получается, что точка вылезет за пределы бокса.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 12, 2015, 13:48 »

... иначе получается, что точка вылезет за пределы бокса.
Да, вылезет, и что? Быть внутри она не обязана, такого ограничения никто не накладывал
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Июнь 12, 2015, 15:48 »

Если координата точки, допустим, по Х прямо пропорциональна размеру объекта по Х - то она будет редуцироваться в 0, если объект имеет размер x=0.000. Т.е. точка будет по-любому (визуально) лежать на объекте.

Ну к примеру: изначально задана ширина объекта по Х = 10, относительная координата точки xt = 5.
Тогда коэффициент xk = xt / X = 5/10 = 0.5.
Далее всегда будет верно: xt = X*xk.

Если объект увеличили вдвое: X = 20, xt = 10.
Если объект уменьшили вдвое: X = 5, xt = 2.5.
Если объект уменьшили в 100 раз: X = 0.01, xt = 0.005.
Если объект уменьшили в 10000 раз: X = 0.0001, xt = 0.00005.

Как мы видим, xt стремится к бесконечно малой величине - т.е. редуцируются практически в 0.
То есть при размере X = 0, xt = 0*0.5 = 0.

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июнь 13, 2015, 06:16 »

Ну к примеру: изначально задана ширина объекта по Х = 10, относительная координата точки xt = 5.
Тогда коэффициент xk = xt / X = 5/10 = 0.5.
Далее всегда будет верно: xt = X*xk.
Ну вот видите - оказывается Вы прекрасно понимаете что такое относительные величины Улыбающийся И, не побоюсь предположить, другие тоже. Так зачем же играть в "непонятки"?  Улыбающийся

Только вот решения не видно. Юзверь может свободно двигать точку (звездочка на схеме выше), при этом в editBox X должно отображаться "нечто разумное" - и то что размер по X нулевой его совершенно не волнует. И если окно UI было закрыто и вновь открыто - точка должна оказаться в том же месте куда ее поставили. Поэтому лепить ноль не выход.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Июнь 13, 2015, 15:31 »

Ткну пальцем в жёпу. А если масштабирование объекта сделать отдельно, а размеры - отдельно. Т.е. есть у нас куб размера (1. 1. 1.). И есть точка (2. 1. -2.). Скейлим куб в 0.00001 раз, точка переходит в 0.00001*(2. 1. -2.). Юзверю показываем отскейленные цифры (возможно, ноль, если не хватает точности). Но сохраняем исходные корды+скейлфактор.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 14, 2015, 09:41 »

А если масштабирование объекта сделать отдельно, а размеры - отдельно. Т.е. есть у нас куб размера (1. 1. 1.). И есть точка (2. 1. -2.). Скейлим куб в 0.00001 раз, точка переходит в 0.00001*(2. 1. -2.). Юзверю показываем отскейленные цифры (возможно, ноль, если не хватает точности). Но сохраняем исходные корды+скейлфактор.
Oтскейленные цифры не относительные а абсолютные, поэтому изменятся при смене объекта. Получается UI которое само ставит цифры - ой нет.

Ладно, расскажу как я сделал. Вычисляю средний размер по 3 осям. Если размер по X(Y, Z) меньше среднего в 100 раз, то при переводе относительные/абсолютные задействуется средний, иначе просто размер по этой оси. При изменении объекта с вырожденного на нормальный (или наоборот) точка конечно "отлетает" но значение (X) остается разумным. А при обратном изменении попадает в исходное положение.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.