Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/64: Рейтинг темы: голосов - 64, средняя оценка - 4.97
7 / 5 / 2
Регистрация: 25.05.2013
Сообщений: 112
1

Расчёт шкалы и цены деления

06.11.2019, 00:05. Показов 11995. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!

Пытаюсь нарисовать шкалу для диаграмм некоторых значений и не могу понять, как лучше сделать.

К примеру:
есть набор значений, который изменяется от -268 до 38009 (минимум и максимум).
График построен, нужно нарисовать шкалу к этой диаграмме. Шкала должна быть умещена в определенную высоту (высота может меняться и шкала перерисовывается). Количество делений на шкале меняется в соответствие с доступным местом, а минимум и максимум остаются такими же, а так же нужно выравнять цену деления шкалы.

Что приходит в голову:
  1. Находим количество возможных значений на диаграмме abs(MIN)+abs(MAX) =38009 + 268 = 38277
  2. Смотрим на высоту TImage, на котором собираемся рисовать шкалу (пусть будет 100px)
  3. Делим шкалу на 4 (Пусть через каждые 3 пикселя будет деление), получаем 25 делений
  4. Делим общее число значений на 25 38277/25 = 1531,08 - это у нас цена деления.
  5. Кривая цена деления получается. Добиваем ее до 1600 (хотя бы так).
  6. Получается, что максимум в этом случае на шкале будет 1600 * 25 = 40000 - 1600 = 38400 (а может и оставить 40000)
  7. А минимум будет -1600

Суть вопроса: Как правильно рассчитать шкалу и цену деления ? С учетом того, что высота шкалы может меняться, а параметры могут быть разными и диапазоны измерений тоже разные (могут быть в пределах от -2 до 2, например).
Может алгоритм какой есть для подобных случаев ? Как правильно рассчитывается кратность цены деления, количество делений и т. д.

Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2019, 00:05
Ответы с готовыми решениями:

Определение цены деления шкалы прибра
Вольтметр рассчитан на измерение напряжений в Uvh = 3 ( B). собственный сопротивление прибора Rv =...

Определить цену деления шкалы прибора
Вольтметр рассчитан на измерение напряжений в Uvh = 3B. Собственное сопротивление прибора Rv = 300...

цена деления шкалы прибора равна 0,3
цена деления шкалы измерительно прибора равна 0,3 пологая что при отсчете ошибка округления...

Определить цену деления шкалы и чувствительность миллиамперметра
Для измерения силы тока используется миллиамперметр с равномерной шкалой, разделенной на 50...

21
случайный прохожий
2934 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,160
06.11.2019, 09:02 2
Можешь глянуть здесь: Динамическое изображение: астроида
Правда, у меня количество делений не меняется (меняется масштаб, цена деления и мин. / макс. значения).
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
06.11.2019, 10:17 3
Цитата Сообщение от gunslinger Посмотреть сообщение
Можешь глянуть здесь: Динамическое изображение: астроида
Там нету ответа на вопрос ТС'а. Его не интересует, как нарисовать шкалу. Его интересует, каким правильным математическим алгоритмом рассчитать диапазон шкалы и цену деления в том случае, когда имеем "кривые" граничные значения параметра. Чтобы шкала получилась красивая, в том смысле, что удобная для восприятия человеком (а не машиной)
0
7 / 5 / 2
Регистрация: 25.05.2013
Сообщений: 112
06.11.2019, 14:52  [ТС] 4
Evg, совершенно в дырочку. Есть идеи ? или хотя бы как загуглить, а то мозг кипит немного.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
06.11.2019, 21:47 5
Цитата Сообщение от Fastex007 Посмотреть сообщение
Есть идеи ?
Нету. Просто когда-то мне это тоже нужно было, я самостоятельно ничего интересного не нашёл. В первую очередь из-за того, что не понятно, как правильно сформулировать запрос (хз как эта проблема по научному называется)

P.S. Я попросил модераторов перенести тему в другой раздел, относящийся к теории, а не к Borland'у
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
07.11.2019, 10:52 6
Цитата Сообщение от Fastex007 Посмотреть сообщение
abs(MIN)+abs(MAX) =38009 + 268 = 38277
А если макс и мин имеют одинаковый знак? Правильно:
abs(MAX - MIN) = 38009 - (-268) = 38277

Добавлено через 42 секунды
Цитата Сообщение от Fastex007 Посмотреть сообщение
Может алгоритм какой есть для подобных случаев ?
Чем не устраивает алгоритм, который Вы привели?
0
7 / 5 / 2
Регистрация: 25.05.2013
Сообщений: 112
07.11.2019, 11:26  [ТС] 7
Цитата Сообщение от Shamil1 Посмотреть сообщение
Чем не устраивает алгоритм, который Вы привели?
Спасибо за ответ!

Не понимаю, как должна выглядеть шкала. В примере я привел число делений 25 на шкале, но это больше случайное значение. Как шкала должна выглядеть "правильно" - с большей частотой делений или с минимальной? Как рассчитать эту оптимальность?
От частоты делений шкалы будет зависеть цена делений, соответственно, если значение цены кривое, то есть надо выравнять. Чтобы выравнять, я предполагаю, нужно понять порядок числа, последовательно разделяя его на 1/10/100/1000/..., пока целая часть не будет равно 0, а потом дополнить число до круглого значения из предыдущего порядка (то есть если цена деления 1578, то порядок всего числа 1000, а дополняем до следующей сотни) или как правильно это делается ?

Или вообще наоборот: сначала считаем цену деления оптимальную (что может являться критерием оптимальности?), а уже потом строим шкалу с нужной частотой?
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
07.11.2019, 13:15 8
Самый простой вариант - не заморачиваться, сделать шкалу от минимума до максимума с разбиеним на нужное количество делений. Получатся кривые числа, ну и ладно.

Можно подсмотреть в каком-нибудь редакторе, который строит графики и делает к ним шкалы. Хоть Excel, хоть математические пакеты типа Mathcad.

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

1) Максимальное количество делений шкалы ограничивается размером "полотна". Нет смысла делать деления в каждом пикселе, они все сольются. Нужен отступ между делениями. Выбрать минимальный отступ можно из субъективной оценки "красивости" получающейся сетки. Предположим, что минимальный отступ между двумя делениями возьмём в 10 пикселей. Если размер полотна "400" пикселей, значит делений должно быть не больше 40 (400/10).

2) Выбор шага между делениями зависит от природы измеряемой величины. Больший уровень шкалы может быть представлен некоторым количеством единиц меньшего уровня. Количество единиц меньшего уровня должно укладываться ровно в больший уровень. Если переход с уровня на уровень составляет 10, то количество делений меньшего уровня может быть 2, 5 или 10. Если переход с уровня на уровень составляет 60 (секунды, минуты, часы), то количество делений меньшего уровня может быть 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 или 60.

3) Определяем отображаемую дельту значений. Находим наибольший уровень шкалы. Начинаем переходить к более мелким шкалам по числам из пп2, т.е. увеличиваем количество делений. Получается некое количество делений, если оно меньше максимального из пп1, то переходим к ещё более мелкой шкале. И так далее.

4) Выравнивание смещения по 0. Предположим, что выбрана шкала с шагом 5 единиц. Можно разметить график в точках 11, 16, 21, 26... Можно разметить график 12, 17, 22, 27... Но всё это смотрится немного криво. Лучше исходить из того, что идя по шкале с заданным шагом мы всегда придём в 0. Таким образом правильнее размечать 10, 15, 20, 25...
0
Модератор
Эксперт функциональных языков программирования
3051 / 2193 / 459
Регистрация: 26.03.2015
Сообщений: 8,469
07.11.2019, 14:38 9
Цитата Сообщение от Fastex007 Посмотреть сообщение
Как шкала должна выглядеть "правильно" - с большей частотой делений или с минимальной?
Нет универсального (для всех задач) ответа. На некоторых часах между соседними делениями 5 минут (всего 12 делений и нет секундной стрелки), а на некоторых - 1 секунда (всего 60 делений и есть секундная стрелка).
0
7 / 5 / 2
Регистрация: 25.05.2013
Сообщений: 112
07.11.2019, 14:50  [ТС] 10
Цитата Сообщение от Ygg Посмотреть сообщение
Самый простой вариант - не заморачиваться, сделать шкалу от минимума до максимума с разбиеним на нужное количество делений. Получатся кривые числа, ну и ладно.
Ровно так и сделал, но по ТЗ есть мутные намеки на визуальную оценку диаграмм, и руководитель развеял сомнения, сказал, что выравнять и цену и минимум с максимумом всё-таки надо.

Цитата Сообщение от Ygg Посмотреть сообщение
1) Максимальное количество делений шкалы ограничивается размером "полотна". Нет смысла делать деления в каждом пикселе, они все сольются. Нужен отступ между делениями. Выбрать минимальный отступ можно из субъективной оценки "красивости" получающейся сетки. Предположим, что минимальный отступ между двумя делениями возьмём в 10 пикселей. Если размер полотна "400" пикселей, значит делений должно быть не больше 40 (400/10).
2) Выбор шага между делениями зависит от природы измеряемой величины. Больший уровень шкалы может быть представлен некоторым количеством единиц меньшего уровня. Количество единиц меньшего уровня должно укладываться ровно в больший уровень. Если переход с уровня на уровень составляет 10, то количество делений меньшего уровня может быть 2, 5 или 10. Если переход с уровня на уровень составляет 60 (секунды, минуты, часы), то количество делений меньшего уровня может быть 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 или 60.
3) Определяем отображаемую дельту значений. Находим наибольший уровень шкалы. Начинаем переходить к более мелким шкалам по числам из пп2, т.е. увеличиваем количество делений. Получается некое количество делений, если оно меньше максимального из пп1, то переходим к ещё более мелкой шкале. И так далее.
4) Выравнивание смещения по 0. Предположим, что выбрана шкала с шагом 5 единиц. Можно разметить график в точках 11, 16, 21, 26... Можно разметить график 12, 17, 22, 27... Но всё это смотрится немного криво. Лучше исходить из того, что идя по шкале с заданным шагом мы всегда придём в 0. Таким образом правильнее размечать 10, 15, 20, 25...
Спасибо за помощь!
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
07.11.2019, 15:39 11
Цитата Сообщение от Evg Посмотреть сообщение
как правильно сформулировать запрос (хз как эта проблема по научному называется)
В гугле “перевод числа из одного диапазона в другой”
Преобразовать числа из одного диапазона в другой

(value-From1)/(From2-From1)*(To2-To1)+To1;
Зная мин From1, макс From2 нужно найти процентное значение value относительно его пределов.

“(value-From1)/(From2-From1)” вот тут это и делают, вроде как называют нормализация, возвращает от 0 до 1, это просто аналог процентов.

Дальше зная мин To1, макс To2 второго числа нужно умножить процентное значение value на второе число.
“(value-From1)/(From2-From1)*(To2-To1)”

“+To1” это добавляют мин второго числа т.к. обычно координаты графика не с нуля.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.11.2019, 19:43 12
Цитата Сообщение от Excalibur921 Посмотреть сообщение
(value-From1)/(From2-From1)*(To2-To1)+To1;
Зная мин From1, макс From2 нужно найти процентное значение value относительно его пределов
Допустим, интересующий диапазон значений - от 0.0013 до 99.7391. Нам нужно разбить весь интервал на 10 отрезков. Посчитай, что получится по твоим формулам. И прикинь, как бы ты сделал без формул
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
07.11.2019, 20:38 13
Разделить ответ на размер дискретного значения числа2 и округлить до целых это высшая математика?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.11.2019, 20:43 14
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Разделить ответ на количество дискретных значений числа2 и округлить до целых это высшая математика? =)
Ты приведи конкретные значения, которые получаются по формулам. И опиши, что к чему и по каким формулам округлял. И чтоб не смущали понятия типа "целое" замени в задаче диапазон значений на "от 13 до 997391"
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
07.11.2019, 20:43 15
Ага а потом и умножить на размер шага числа2 хех…формула то растет.
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
07.11.2019, 21:10 16
Как-то так выходит, пару добавлений.
From1=-268
From2=38009
To1=0.0013
To2=99.7391
Step=(To2-To1)/10=9.9738

Value2=round(((Value-From1)/(From2-From1)*(To2-To1))/Step)*Step
Value3=If[Value2==0, To1, Value2]
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
07.11.2019, 22:24 17
Что-то нифига не понял, откуда у тебя так много входных параметров, что конкретно они означают, и что такое Value. Есть у меня подозрение, что ты банально не правильно понимаешь поставленную задачу

Перефразирую задачу в конкретных числах. Мы имеем некий набор точек, условно набор значений функции по оси Y. Ось X нас не интересует. Известно, что минимальное значение Y - это 0.0013, максимальное значение Y - 99.7391. Мы хотим нанести значения на график. Нам нужно вычислить, как будет выглядеть сетка по оси Y, чтобы это было удобно для восприятия

На входе:
LOW=0.0013 - минимальное значение параметра
HIGH=99.7391 - максимальное значение параметра

Что хотим получить на выходе:
START=0.0000 - начальное значение сетки
STEP=10.0000 - шаг сетки
COUNT=10 - количество интервалов в сетке

Т.е. 3 выходных параметра описывают сетку Y со значениями: 0.0000, 10.0000, 20.0000 ... 100.0000
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
07.11.2019, 23:29 18
Цитата Сообщение от Evg Посмотреть сообщение
Что-то нифига не понял
Печалька.

А так?
From1=LOW=0.0013
From2=HIGH=99.7391
To1=START=0.0000
STEP=10.0000 - шаг сетки,
COUNT=10 количество интервалов
To2= START+STEP* COUNT=0+10*10=100
Step=STEP

Value2=round(((Value-From1)/(From2-From1)*(To2-To1))/Step)*Step
Value3=If[Value2==0, To1, Value2]
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
08.11.2019, 10:58 19
Я пас. Ты упорно не хочешь понять смысла задачи

Добавлено через 1 час 22 минуты
Цитата Сообщение от Excalibur921 Посмотреть сообщение
START=0.0000
STEP=10.0000 - шаг сетки,
COUNT=10 количество интервалов
Почему-то ты эти параметры считаешь ВХодными. А они как раз ВЫХодные. Т.е. их надо рассчитать, а не вбивать в код

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Value2=round(((Value-From1)/(From2-From1)*(To2-To1))/Step)*Step
Value3=If[Value2==0, To1, Value2]
Я не понимаю, что такое Value, т.к. оно не было инициализировано. Да и не понимаю синтаксис того, что есть Value3. Но сильно подозреваю, что ты пытаешься нарисовать сетку по заранее рассчитанным параметрам. А задача не в этом. Задача состоит в том, чтобы алгоритмически рассчитать те параметры, которые у тебя хардкодом вбиты как константы.

В посте #17 я всё четко расписал. ВХодных параметров у нас только 2 (LOW и HIGH). Надо рассчитать 3 ВЫХодных параметра (START, STEP, COUNT). Для этих параметров у меня уже вбиты значения, это как бы желаемый ответ
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
08.11.2019, 11:22 20
Цитата Сообщение от Evg Посмотреть сообщение
что такое Value
По ссылке поста 11 никак не пройти? Там жевать не пришлось.

Цитата Сообщение от Evg Посмотреть сообщение
почему-то ты эти параметры считаешь ВХодными. А они как раз ВЫХодные
Зачем тогда их определили =)).
Цитата Сообщение от Evg Посмотреть сообщение
синтаксис того, что есть Value3.
If[ <Condition>, <Then>, <Else> ]
Если <Condition> верно, вернуть <Then>, иначе<Else>.

Цитата Сообщение от Evg Посмотреть сообщение
ВХодных параметров у нас только 2 (LOW и HIGH). Надо рассчитать 3 ВЫХодных параметра (START, STEP, COUNT).
Тут просто STEP=(HIGH - LOW)/ COUNT

Мда…кароч суть задачи я понял так:
Cделать уравнение перевода по линейному закону величину от
From1=-268 до From2=38009
в величину от
To1=0 до To2=100 с шагом Step пикселей.
0
08.11.2019, 11:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2019, 11:22
Помогаю со студенческими работами здесь

Какой будет цена деления шкалы прибора?
Добрый вечер. Очень Вас прошу помогите решить задачу. Вольтметр рассчитан на измерение...

программа должна переводить температуру в другие шкалы и шкалы выбирает юзер но что то не работает
#include &lt;stdio.h&gt; int main() { char inputType; double vveditechislo; double...

Расчет цены
При изменении параметра &quot;Коэффициент&quot; автоматически пересчитывается &quot;РасчетнаяЦена&quot; в табличной...

Расчет цены
Здравствуйте, подскажите пожалуйста как лучше всего реализовать... имеется компания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru