Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по графике  (Прочитано 8295 раз)
0 Пользователей и 1 Гость смотрят эту тему.
pegas
Гость
« : 28-10-2003 07:29 » 

Поставлена задача по написанию "простенькой" системы  проектирования. Все сводится к созданию/отображению и модификации уже созданных  объектов, у которых в качестве ребер могут быть прямые или дуги правильных окружностей, а также как отдельный объект рассматриваются плоскости, ограниченные
ребрами.
     Процесс создания должен быть интерактивным, т.е. пользователь самостоятельно рисует конструкцию (мышкой). Т.о. необходимо обрабатывать события мыши(клики) на ребрах и плоскостях.
    Я просмотрел большой объем литературы и источников в сети, но к сожалению, кроме "FAQ по геометрии" ничего полезного не нашел.
     Вопрос же в следующем, если вы имели опыт по работе с векторной графикой, то не могли бы Вы объяснить "необходимый" принцип представления данных, с учетом того, что потом понадобиться активно с ними работать(обрабатывать  клики, передвигать ребра и т.п.), а также как обрабатывать клики мыши на изображении?
     В дальнейшем это все планируется связать с БД, откуда будут
браться всевозможные спецификации и параметры(ширина ребра,
допуски и т.п.). Связь с базой, вполне решаемая задача, т.к. опыт по
работе с ними у меня есть, а вот с графикой, в "истинном" ее
понимании, столкнулся первый раз. Поэтому, если есть мысли
по данному вопросу, то не могли бы Вы помочь?

Любые коментарии по теме только приветствуются Улыбаюсь
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-10-2003 10:21 » 

В дипломе я выходил из положения так
Был написан австрактный графический объект  который знал где он находится на экране   с какими объектами связан, умел коректно отображать себя там по средством OnDraw(CDC *pDC )  и прочие основные функции включаяя
bool IsMy(int X,int Y)// на входе координаты на выходе ответ попали мышой или нет
int Im()

был написан контейнер который умел работать с этим стандартным объектом
Все методы вертуальные.
А дале все реальные обекты наследовались от него и соотвествубщие методы переопределялись.

Явный минус такой организации чтобы ответить на вопрос в кого мы попали мышой нужно перебрать все объекты Жаль
Записан

Да да нет нет все остальное от лукавого.
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #2 : 28-10-2003 10:39 » 

Угу, я тоже делал бы похоже. Тут основная проблема будет написать абстракный базовый класс, в котором должны присутствовать все необходимые тебе функции типа Draw, IsMy, Create, Move etc.

Цитата

Явный минус такой организации чтобы ответить на вопрос в кого мы попали мышой нужно перебрать все объекты

Если объектов мало, то это не страшно. А если их сильно много, то придется заводить отдельные структуры, которые делять пространство на несколько частей и в них хранится какие из объектов присутствуют в данной части. Тогда сначала ты определяешь, в какой части у тебя сейчас мышь, а потом просматриваешь объекты находящиеся в этой части.
Записан

Megabyte be with you!
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 28-10-2003 10:49 » 

Я бы добавил к PSD : лучше когда IsMy(x,y) ищет не попадание точки на объект, а ищет совпадение с пятном круглой или квадратной формы с центром x,y и порогом (шириной или диаметром) n. Ведь если объекты являются однопиксельными линиями, то точно попасть в них мышкой нелегко (или просто неудобно).
И возвращать лучше не bool, а растояние до центра пятна - на случай если в пятно попадает несколько объектов. Или другой вариант: как в 3D Max - повторный одиночный клик при неподвижной мышке - выбор другого объекта под курсором.
От перебора все равно не уйдешь - главное как его уменьшить. Перебор всего набора или до первого совпадения - на мой взгляд не важно - разница в скорости всего в два раза.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
pegas
Гость
« Ответ #4 : 29-10-2003 09:27 » new

Цитата

Если объектов мало, то это не страшно. А если их сильно много, то придется заводить отдельные структуры, которые делять пространство на несколько частей и в них хранится какие из объектов присутствуют в данной части. Тогда сначала ты определяешь, в какой части у тебя сейчас мышь, а потом просматриваешь объекты находящиеся в этой части.

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

Вот такие мысли иногда появляются, но если действительно очень надо Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines