Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно построить граф... нужен компонент... 
:(
    Опции темы
Kurt
Дата 9.9.2003, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Здравствуйте.
В процессе моей производственной деятельности (производство программ smile.gif ) возникла нужда построить что-то типа графа - т.е. отмечены точки, некоторые из которых соединены между собой.
Т.е. надо изобразить точки и отрезки.
Рисовать ручками не очень-то хочется: надо учитывать размеры формы, переворачивать ось OY etc.
Может, есть какой компонент для этого? Или со стандартным MSChart как-нибудь поколдовать?
Буду искренне рад ответу...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Black_Star
Дата 9.9.2003, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



А зачем 0Y переворачивать? Об этом поподробнее пжлста...
А нарисовать отрезки и точки можно вери изи... не надо и на ограничения формы смотреть...
PM ICQ   Вверх
Kurt
Дата 10.9.2003, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Вери изи?
В общем так.
Создается программа для социологических исследований. Но сейчас это не имеет значение. Нужно:
Есть точки:
допустим:
(100,100), (-100,5) , (-300,500)
Мне эти точки нужно отметить на форме, считая середину формы центром координат.
1-ю и 2-ю точки соединить отрезком.
Выбрать правильный масштаб - чтоб все точки были видны.
А так же эти точки должны быть изображены в соответствии с представлением простых смертных об осях координат ("OY - это когда ось направлена снизу вверх").
З.Ы. Реально будет около 500 точек. Но соединены будут немногие...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
cardinal
Дата 10.9.2003, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Ну так помоему тут нет ничего сложного. Вот мои мысли по этому поводу:

1. Рисовать ты хочешь от центра формы. Отлично, вычисляем этот центр. Координаты у него такие
P ( x | y ), где x = width / 2 и y = height/2
2. Подстраиваешь координаты своих точек под новый центр и получаешь:
Z ( x + a | y - b ) a = X-координата твоей точки, b = Y-координата твоей точки
для твоих примеров получаем:
A ( x + 100 | y - 100 ), B ( x - 100 | y - 5 ), C ( x - 300, y - 500 )
3. масштаб выберешь сам smile.gif
4. соединяешь те новые точки, которые тебе надо.

Может я ошибаюсь confused.gif, все же просто вроде...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Guest
  Дата 10.9.2003, 17:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Выбрать правильный масштаб - чтоб все точки были видны.


Очень просто.
Элементарная зависимость.

maxPoint - SizeOfGraf

tekPoint - iskKoord

откуда:

iskKoord = tekPoint * SizeOfGraf / maxPoint

Где iskKoord - искомая координата
tekPoint - текущее значение точки (из соц. опроса)
SizeOfGraf - размер оси в пикселах
maxPoint - максимальное значение
  Вверх
Mephisto
  Дата 10.9.2003, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата
Выбрать правильный масштаб - чтоб все точки были видны.


Очень просто.
Элементарная зависимость.

maxPoint - SizeOfGraf

tekPoint - iskKoord

откуда:

iskKoord = tekPoint * SizeOfGraf / maxPoint

Где iskKoord - искомая координата
tekPoint - текущее значение точки (из соц. опроса)
SizeOfGraf - размер оси в пикселах
maxPoint - максимальное значение

Извини, не подписался. withstupid.gif
PM   Вверх
Black_Star
Дата 10.9.2003, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



Цитата
2. Подстраиваешь координаты своих точек под новый центр и получаешь:
Z ( x + a | y - b ) a = X-координата твоей точки, b = Y-координата твоей точки
для твоих примеров получаем:
A ( x + 100 | y - 100 ), B ( x - 100 | y - 5 ), C ( x - 300, y - 500 )


smile.gif А можно, дорогие друзья, сделать ЕЩЕ проще smile.gif
Как я уже сказал "вери изи"

Установка "размера" координат:
me.Scale(x1,y1,x2,y2)
где x1,y1 - левый верхний угол
x2,y2 - правый нижний.
Например:
me.Scale(-5,-5,5,5)
me.Pset(0,0),vbRed

и точка будет точно по центру формы...
Остается только знать мин. и макс. значения по Х и по У. smile.gif
PM ICQ   Вверх
Black_Star
Дата 10.9.2003, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



И еще поправка, чтобы форма было похожа на реальную 2х мерную систему, надо писать:
me.Scale(-5,5,5,-5)

PM ICQ   Вверх
Kurt
Дата 10.9.2003, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Всем спасибо.
Balck_Star, мне твой метод больше всех понравился.. smile.gif
Я об этом не знал...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
cardinal
Дата 10.9.2003, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Да, он прав. Еще осталось только сделать что-нибудь типа:
Код
Me.Scale (-Width / 10, Height / 10)-(Width / 10, -Height / 10)

для того чтобы квадрат
Код

Me.PSet (0, 0), vbRed
Me.PSet (-100, -100), vbGreen
Me.PSet (-100, 100), vbGreen
Me.PSet (100, -100), vbGreen
Me.PSet (100, 100), vbGreen

оставался квадратом. Но тут есть какая-то недодумка с моей стороны потому, что квадрат не совсем квадратный, но почему это так я пока не допер.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Kurt
Дата 11.9.2003, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Цитата

Но тут есть какая-то недодумка с моей стороны потому, что квадрат не совсем квадратный, но почему это так я пока не допер.

Естественно, он не будет квадратный - происходит трансформация координат "под форму" - цена деления привязывается к Width и Height:
на одну координату вверх= на 5 пикселей вверх
на одну координату влево = на 10 пикселей влево.
Цифры 5, 10.. зависят от размеров формы - поэтому и квадрат "не будет квадратным" на неквадратной форме... (во загнул... smile.gif )


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
cardinal
Дата 11.9.2003, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Kurt, ты проведи такой эксперимент
Код
Private Sub Command1_Click()
Me.Scale (-Width / 10, Height / 10)-(Width / 10, -Height / 10)
Me.PSet (0, 0), vbRed
Me.PSet (-100, -100), vbGreen
Me.PSet (-100, 100), vbGreen
Me.PSet (100, -100), vbGreen
Me.PSet (100, 100), vbGreen
End Sub

и увидившь, что разницу между фигурами на глаз даже не видно, когда нарисуешь их несколько штук меняя при этом каждый раз размер формы. Поэтому я бы именно так и сделал: простая зависимость от размера формы. Мне просто в голову не приходит, как сделать Me.Scale по другому, чтобы квадрат более квадратный был smile.gif. В Си++ то что тут нам в принципе надо называется MapMode. Так вот там прописывается ANISOTROPIC или ISOTROPIC, и таким образом у тебя, например, или квадрат или прямоугольник получается.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Black_Star
Дата 11.9.2003, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



[QUOTE]Но тут есть какая-то недодумка с моей стороны потому, что квадрат не совсем квадратный, но почему это так я пока не допер.[QUOTE]

Возможно причина в том, что сама форма имеет "неквадратные" размеры smile.gif
Ежели width будет равна height, то квадрат будет похож на то, как называется smile.gif
PM ICQ   Вверх
cardinal
Дата 12.9.2003, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата
Возможно причина в том, что сама форма имеет "неквадратные" размеры

"Возможно" означает, что ты не уверен? Я просто еще раз хочу подчеркнуть, что если растягивать форму по горизонтали от совсем узкой до широкой (на весь экран) размер "квадрата" меняется не пропорционально этой растяжке.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Black_Star
Дата 12.9.2003, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



О чем я и говорю!
А "неуверен", такого не бывает...
Есть 3 причины:
1) растянута форма;
2) настройки экрана непропорциональны;
3) глаза косят smile.gif.
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0949 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.