Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Май 27, 2015, 08:36



Название: Относительные величины
Отправлено: Igors от Май 27, 2015, 08:36
Добрый день

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

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

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

Спасибо



Название: Re: Относительные величины
Отправлено: Racheengel от Май 27, 2015, 12:19
Цитировать
если размеры текущего объекта нулевые (или достаточно малы) вдоль одной или двух осей

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


Название: Re: Относительные величины
Отправлено: Igors от Май 27, 2015, 12:33
дизаблить поля ввода?
или что вообще требуется сделать?
Ага, ага
Цитировать
Чего там думать, вникать - это ж надо хотя бы внимательно прочитать. Закину вопрос - пусть все разжует, в конце-концов ему надо а не мне
Racheengel, просьба воздух не гонять. Неясен вопрос - я как-нибудь проживу без Вашего ответа. Все Ваши последующие вопросы вынужден просто гонорировать. Спасибо за понимание.


Название: Re: Относительные величины
Отправлено: Racheengel от Май 27, 2015, 21:16
Цитировать
Чего там думать, вникать - это ж надо хотя бы внимательно прочитать. Закину вопрос - пусть все разжует, в конце-концов ему надо а не мне
- вообще-то это не я писал. Ошибочка вышла :)

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



Название: Re: Относительные величины
Отправлено: Racheengel от Июнь 11, 2015, 00:24
Igors, я не злорадствую и не люблю этого, но - где же ответы? А может, просто вопроса никто не понял? Может же такое быть?


Название: Re: Относительные величины
Отправлено: Bepec от Июнь 11, 2015, 01:12
Просто вопроса в сообщении ТСса нет, он где то в его мыслях остался.
Отвечать не на что.


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

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

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

Вряд ли здесь "что-то непонятно". Просто нужно думать самому, а с готовыми удобными классами так не хочется :) Вот если бы это было в букваре..... а так, какой-то "крайний случай" - та ну его, пусть сам разбирается. И вообще вопроса не было (как сказал набежавший хвостик  :))


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


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


Название: Re: Относительные величины
Отправлено: Racheengel от Июнь 12, 2015, 13:35
Что-то не так здесь. Насколько я понимаю, точка должна принадлежать объекту (т.е. быть внутри него либо лежать на поверхности). Если размер бокса по x=0.000, то локальная координата точки x тоже должна быть вычислена как 0.000 (независимо от ее заданного относительного смещения), иначе получается, что точка вылезет за пределы бокса.


Название: Re: Относительные величины
Отправлено: Igors от Июнь 12, 2015, 13:48
... иначе получается, что точка вылезет за пределы бокса.
Да, вылезет, и что? Быть внутри она не обязана, такого ограничения никто не накладывал


Название: Re: Относительные величины
Отправлено: Racheengel от Июнь 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.



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

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


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


Название: Re: Относительные величины
Отправлено: Igors от Июнь 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) остается разумным. А при обратном изменении попадает в исходное положение.