Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Поставить точку на графике, и определить ниже она линии или нет  (Прочитано 4809 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Приветствую всех!
Исходные данные представляют собой следующее, дана рабочая точка предельных нагрузок движка.
Mmax=<вещественное число> Нм
Nmax=<вещественное число> об/мин
Дан график, к сожалению в виде картинки :(, а не в виде таблицы:

Интересуют только сплошные линии, штриховую линию игнорить нужно.
А теперь соль вопроса:
1.  Как поставить на картинке эту рабочую точку?
2.  Как определить, что данная точка ниже или выше скажем линии CM90M?
3.  Чем пользоваться для этих целей? (Допускаю библиотеки для C++, Python)
4.  Реально ли реализовать это на Python'е или C++ за 2-3 дня включая изучение материала?
5.  Также желательно на выходе получать *.eps файл. (Верстаю курсовую на LaTeX'е с использованием таких картинок.)
Всего таких картинок для проверки 9 штук, если уж что, можно и отредактировать, правда на некоторых имеется двойная шкала.

Если максимально движок разгоняется до 3000 об/мин, то выбирается строка 1 и т.д.

P.S. Больше интересует Python, по двум основным причинам:
1.  Есть код выбора движка с использованием БД SQlite3 не хотелось бы переписывать его на C++ (времени в обрез)
2.  Придется сопрягать Python и C++, этим я ни разу не занимался (опять же трата времени).

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Что значит поставить точку? По координатам - автоматически или вручную?

ИМХО, проще всего перевести картинку в график, т. е. таблицу, есть программы, которые умеют это.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5743
  • Все по палатам!
    • Просмотр профиля
Если все переведено в цифру (поиск, как Phlya сказал), то остальное не проблема на любом языке программирования.
Извините, я все еще учусь

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Поставить точку на графике по координатам автоматически.

В итоге решил пока ручками отделаюсь, позднее разгребаться с этим буду, если вообще буду :)

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Кстати, я тут подумал, есть же программы, которые растр умеют анализировать и преобразовывать в вектор. Может, потом из вектора извлечь данные, и все будет совсем просто? Никто не пробовал?
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн viktand

  • Участник
  • *
  • Сообщений: 190
    • Просмотр профиля
1. Сначала слегка доработать картинки: открыть их в любом редакторе и перекрасить линии графиков в другой цвет. Иначе ни одна программа не отличит их от линий шкалы (без сложного анализа на периодичность сетки). И вид получится более солидным. Каждому графику на отдельной картинке задать свой цвет и запомнить для себя сначала, где какой какого цвета - программа вряд ли сможет соотнести название графика и соответствующую линию. Так же запомнить диапазон значений для каждого графика.

2. В программе создаем стандартный объект типа image и загружаем в него картинку. Получаем значение точки (не знаю как, может просто вводим число в поле ввода) и пересчитываем его в вертикальную координату image, считая, что верхний ряд пикселов - это ноль, а нижний - это максимальное значение по графику, которое заранее определяем для каждой картинки и задаем в программе (да, надо будет перевернуть программно шкалу координат). Также поступаем с горизонтальной координатой точки.

3. Рисуем точку (для красоты, пользы от этого нет) - это совсем просто.

4. В цикле пробегаем все значения вертикальных координат для заданной точки (т.е. ее горизонтальной координаты): Берем цвет точки, сравниваем с цветом линий графика, если совпадает с одним из них, то сравниваем с координатой точки, определяя выше или ниже она находится.

5. Результат уже есть и его можно выводить в любом виде. Что такое *.eps, я не знаю.

Точно можно использовать C++, C#, Delphi (в смысле Object Pascal через Lazarus (рекомендую)), VB. Наверняка что-то еще, что может работать с растрами без сложных загогулин. Про Pithon у Phlya'и спросите, я его (Pithon) практически не знаю.

Сделать за пару дней... Ну тут сложно что-то сказать. Наверно можно, если других дел нет. В принципе не очень сложно.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Wars ~.o

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Про векторную графику сам задумывался, из более или менее удобных форматов, знаю только *.svg (масштабируемая векторная графика, формат открытый и представляет из себя, xml-документ).

Второй вариант понятен в некоторой степени. Но не легче ли мне тогда самому считать координаты точек и далее построить аккуратный график, с разметкой и точками.
Лично я это представляю так, с использованием *.bmp:
1. Предварительная обработка включает в себя:
 1.1. Перекрашиваем нужные линии в разные цвета, если есть точки пересечения нескольких линий для каждого пересечения задаем свой цвет.
 1.2. Подписи графиков удаляем (цвета запоминаем).
 1.3. Линии сетки делаем толщиной в один растр.
 1.4. Обрезаем картинку только до поля графика
 1.5. Значения осей абсцисс и ординат сохраняем в массивы в имени которых прочитывается имя обработанной картинки.
2. Перед рисованием точки, сделаем следующее.
 2.1. Найдем в массиве ординат, ординату, которая больше ординаты точки, запомним ее номер n.
3. Далее вертикальный проход (1-й растр по x пропускаем там линия сетки и вся вертикаль черная).
 3.1. Обнуляем счетчик.
 3.2. Идем до черной точки, или точки пересечения одной из цветных линий с сеткой (для этих пересечений мы задали свои цвета).
 3.3. Прибавляем счетчик.
 3.3. Если значение счетчика равно n-1.
      Тогда
        Считаем растры (начиная с белого).
        Когда дойдем до следующей черной точки, разделим разность ординат, двух горизонтальных линий сетки на количество растров. И прибавляя полученное значение к нижней границе, найдем номер растра который, ближе всего к нашему значению M.
        После чего начинаем горизонтальный проход, который аналогичен вертикальному (с той лишь разницей, что ось абсцисс имеет разную... не знаю как выразиться. Короче выбираем массив значений абсцисс, который удовлетворяет частоте вращения выбранного двигателя). Когда найдем нужный растр ставим красную точку (если точка попала на линию, используем цвет пересечения (выбираем сами), если на сетку тоже свой цвет, ну и также если на то и то). Далее делаем, то что написал viktand. запускаем вертикальный проход снизу, и если первее всех встретится наша точка, радуемся. Если точка первее интересующей нас линии по цвету или на ней, тоже радуемся, иначе печалимся (требуется другой двигатель подбирать).
      Иначе, продолжаем идти вверх.
4. Допиливаем график.
 4.1. Увеличиваем изображение на определенное количество пикселей, и дорисовываем сетку.
 4.2. Делаем разметку, нанести текст на картинку поможет библиотека, для работы с графикой.
 4.3. Можно для большей красоты просто удалить все те линии которые нас не интересуют, движок выбрали один, а на графике характеристики для 3-х.

To viktand:
Польза от постановки точки, в том, что это методика расчета сервопривода. Если точка ниже интересующей линии, движок прослужит долго и без сбоев. если выше секир башка ему настанет. :)
Таких графиков два. По одному графику проверяем потянет ли двигатель максимально допустимую нагрузку. По второму смотрим потянет ли двигатель номинальную нагрузку в течение эксплуатационного срока.
Координата точки у меня уже автоматически вычисляется и отчет создается, а вот точку на графике пока увы я буду рисовать ручками, так как на начитку материала у меня уйдет примерно недели две (минимум неделя). А к тому времени уже курсовой сдать нужно. :)

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
можно команда convert для скрипт, а путхон ненужно.
Wars ~.o

Оффлайн AlexSpb

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Софта для распознавания нарисованной функции не найдете.
Задачка для первой группы автоматизируется примерно следующим образом:

Делается интерполяция кривыми, в данном случае, на взгляд, будет достаточно полинома 2-й степени. Для этого достаточно снять вручную координаты трех точек с кривой, стандартных программ интерполяции полно.

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

Аналогично для второго графика, пишется функця, с линейными интерполяциями.

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
В питоне это можно достаточно легко, есть очень хорошая библиотека PIL.

Про интерполяцию... Это, мягко говоря, не гарантирует идентичность результата начальному графику. Со вторым, конечно, да, там проще на бумажке коэффициенты для отрезков прямых посчитать.

Пользователь решил продолжить мысль 19 Мая 2013, 10:47:08:
В лучшем случае, только если аппроксимировать сплайном, чтобы адекватно соответствовать изначальному графику. А полином может быть недостаточно точным.
« Последнее редактирование: 19 Мая 2013, 10:47:08 от Phlya »
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн viktand

  • Участник
  • *
  • Сообщений: 190
    • Просмотр профиля
obgorelyi:
я наверно не совсем понял задачу. Мне кажется, что вы планируете очень много лишних операций.
п 1.5 - Это что? Где вы возьмете числа?
Ну и дальше много вопросов. Нет смысла сильно редактировать исходную картинку, достаточно перекрасить линии и отметить особым цветом точку (0;0) Пересечения легко вычисляются аналитически по факту отсутствия на вертикальной линии точки с цветом линии графика, сетка вообще не будет мешать - мы смотрим только точки с цветом линий графиков.

Имеем, к примеру, точку (1500;10) по второй картинке. Пробегаем по вертикальной линии и определяем ординаты цветных точек - получаем результат. Если он устраивает, то рисуем точку и все. Смысл большинства ваших пунктов от 2 до 4 мне не понятен. Работаем, с загруженным в память объектом с растром картинки. Целиком сразу. Потом рисуем на нем точку и сохраняем как результат.
Вы, кстати, кажется путаете "растр" и "пиксел".

Как вариант можно вообще оцифровать картинку, т.е. после редактирования изображения отдельной (самодельной) программой составить файлы, в которых просто перечислить последовательно все точки одного нужного цвета. Т.е. пройти весь растр двойным циклом по x и y и запомнить те (x;y), которые укажут на нужный цвет. Потом уже совсем просто будет по этому массиву найти нужный двигатель.

Оффлайн AlexSpb

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
В питоне это можно достаточно легко, есть очень хорошая библиотека PIL.

Про интерполяцию... Это, мягко говоря, не гарантирует идентичность результата начальному графику. Со вторым, конечно, да, там проще на бумажке коэффициенты для отрезков прямых посчитать.

Пользователь решил продолжить мысль 19 Мая 2013, 10:47:08:
В лучшем случае, только если аппроксимировать сплайном, чтобы адекватно соответствовать изначальному графику. А полином может быть недостаточно точным.

Зря вы так думаете, в вашем случае точность измерения координаты линейкой по бумажке не превысит 1%, там одна толщина линии не меньше 0,5%, да и если точность ваших измерений лучше чем 1% я просто офигею.

В 1%  на полиноме второго порядка вы уложитесь почти наверняка, не хватит второго, возьмите 3-й порядок и уложитесь в 1% точно. Теория рядов говорит, что достаточно длинный ряд интерполирует любую фунцию с любой нужной точностью.

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

Разбивать столь гладкую кривую на куски смысла нет.

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Реализовал эту программку (ставит точки на графики), правда использовал библиотеку Pillow (это форк PIL), а не PIL. У Pillow есть поддержка python3. А для того чтобы код с PIL перегнать на Pillow меняется лишь строчка:
import Imageна
from PIL import Image

Оффлайн Phlya

  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
В итоге, что она делает? Любопытно. И не выложите код?
Ubuntu 14.04 (Unity), MSI GE40

 

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