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

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

нужно написать прогу которая могла строить отрезки длиной от 1 см  до 10 см на экране монитора.
 есть вопросы:

1. как узнать разрешение экрана? (в зависимости от разрешения соответственно будет колебаться длина отрезка)
2. если  разрешение 1024*768 , то как мне вывести отрезок на экран длиной 1 см.

по ходу дела будут еще вопросы!
заранее благодарен. 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-07-2007 17:52 » 

1)
разрешение экрана - апишная функция
GetSystemMetrics

Код:
ширина - GetSystemMetrics(SM_CXSCREEN)
высота - GetSystemMetrics(SM_CYSCREEN)


2) а вот как получить размер пикселя, я никогда не сталкивался, но щас нашёл вот что
Цитата
Теоретически, c помощью функции API GetDeviceCaps можно получить размеры экрана как в миллиметрах так и в пикселах. Дальше, надеюсь, понятно. Но там, помнится, был какой-то баг от мелкомягких, и приходилось действовать через GetSystemMetrics.
(https://forum.shelek.ru/index.php?action=printpage;topic=1423.0)
может поможет Улыбаюсь
Записан

Джон
просто
Администратор

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

« Ответ #2 : 06-07-2007 23:15 » 

На самом деле всё гораздо проще. Размер точки не нужен.

при разрешении экрана 96 dpi и 1280 точках получаем видимую область в дюймах 1280/96=13,333 или в см *2,54 = ~33,867
так же легко можно получить число точек необходимых для отображения например 5,08 см. Для этого их надо перевести в дюймы, а затем умножить на разрешение экрана в dpi. Например для 5,08 см / 2,54 = 2 * 96 = 192 экранных точки.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 07-07-2007 05:03 » 

Джон, осталось только узнать dpi экрана программно Улыбаюсь
Записан

Джон
просто
Администратор

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

« Ответ #4 : 07-07-2007 11:10 » 

Да уж... Трудненькая задачка...

А что если попробовать обмануть? Так сказать в извращённой форме. Не побоятся и всё-таки использовать ф-ю
GetDeviceCaps Ага благо она для этого и предназначена

GetDeviceCaps(LOGPIXELSX) - разрешение по Х

GetDeviceCaps(LOGPIXELSY) - разрешение по У
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 07-07-2007 11:32 » 

Сейчас точно не знаю, но на Windows 95, 98 функция всегда выдавала 96 dpi.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 07-07-2007 12:38 » 

по моему, задача поставлена неверно.

>> "то как мне вывести отрезок на экран длиной 1 см."
 а вот, например , я хочу, чтобы этот символ "_" - это и есть отрезок 1 см )  То есть 1 см - это свойство графического объекта, а  на экране он вовсе не обязан выглядеть как реальные 1 см. Просто все линейные размеры отскалены одинаково. А вот при выводе на печать, там уже возьмётся атрибут "линейный_размер" , драйвер знает dpi контекста устройсва, на который производится вывод. И все дела...
Записан

vvv_1984
Гость
« Ответ #7 : 07-07-2007 13:29 » 

Да уж... Трудненькая задачка...

А что если попробовать обмануть? Так сказать в извращённой форме. Не побоятся и всё-таки использовать ф-ю
GetDeviceCaps Ага благо она для этого и предназначена

GetDeviceCaps(LOGPIXELSX) - разрешение по Х

GetDeviceCaps(LOGPIXELSY) - разрешение по У
можно по подробнее
по моему, задача поставлена неверно.


задача поставлена верно, подробнее:

мне нужно создать программу по психологическому тренингу!
задача в следующем программа выводит в разных частях экрана отрезки случайной длины случайным образом, ребенок должен опредилить длину отрезка на глаз, и ни какая печать не нужна!
Записан
vvv_1984
Гость
« Ответ #8 : 07-07-2007 13:32 » 

На самом деле всё гораздо проще. Размер точки не нужен.

при разрешении экрана 96 dpi и 1280 точках получаем видимую область в дюймах 1280/96=13,333 или в см *2,54 = ~33,867
так же легко можно получить число точек необходимых для отображения например 5,08 см. Для этого их надо перевести в дюймы, а затем умножить на разрешение экрана в dpi. Например для 5,08 см / 2,54 = 2 * 96 = 192 экранных точки.
а как расчитать по твему методу если расширение экрана будет 640*480.
я не понял как ты посчитал(((
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 07-07-2007 13:36 » 

vvv_1984,
Цитата
мне нужно создать программу по психологическому тренингу!
задача в следующем программа выводит в разных частях экрана отрезки случайной длины случайным образом, ребенок должен опредилить длину отрезка на глаз, и ни какая печать не нужна!
коли так, можно ввести калибровочную опцию - скажем, руководитель говорит программе нарисовать на экране отрезки (вертикальный, горизонтальный), достаточно длинные, измерить из линейкой и дать программе знать, что получилось. Далее программа будет знать размер пикселя
Записан

nikedeforest
Команда клуба

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

« Ответ #10 : 07-07-2007 16:14 » 

Улыбаюсь)) ну ты Леха даешь Улыбаюсь)
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 07-07-2007 17:48 » 

 Рисую
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #12 : 08-07-2007 23:57 » 

разрешение экрана всегда равно 96 dpi. но для корректного масштабирования, следует использовать не его, а разрешение формы, а именно - свойство PixelsPerInch. Это свойство указывает, сколько пикселей находится в одном дюйме текущей формы. поскольку рисуете вы всё равно на форме, а не на экране - то ничего другого тут не требуется.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #13 : 09-07-2007 00:02 » 

правда, если это всё реально надо делать на паскале, то там форм в виндовом понимании нет. и там можно тупо юзать 96, потому что разрешение ты всё равно задашь сам для графического режима.
Записан

vvv_1984
Гость
« Ответ #14 : 09-07-2007 04:14 » 

разрешение экрана всегда равно 96 dpi. но для корректного масштабирования, следует использовать не его, а разрешение формы, а именно - свойство PixelsPerInch. Это свойство указывает, сколько пикселей находится в одном дюйме текущей формы. поскольку рисуете вы всё равно на форме, а не на экране - то ничего другого тут не требуется.
программа мишеться на Паскале 7.0
правда, если это всё реально надо делать на паскале, то там форм в виндовом понимании нет. и там можно тупо юзать 96, потому что разрешение ты всё равно задашь сам для графического режима.
да нужно работать с графическим режимом.
Записан
vvv_1984
Гость
« Ответ #15 : 09-07-2007 04:15 » new

1.я почему то забыл про графический режим, и все пытался через crt.((((...вот блин...
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #16 : 09-07-2007 09:55 » 

vvv_1984, вопреки распространённому мнению, паскаль позволяет выводить графику и в текстовом режиме Улыбаюсь но это делает путём перепрограммирования ПЗУ знакогенератора. и задача, в целом, не тривиальная. хотя и решаемая.
Записан

vvv_1984
Гость
« Ответ #17 : 09-07-2007 12:39 » 

x77,  так все-жи алгоритм действий какой, в моей задачи?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #18 : 09-07-2007 16:04 » 

vvv_1984, надо думать. скачать турбопаскакаль 7.0, и покопаться в graph.tpu.

не готов ответить навскидку, прошу прощения. завтра отпишусь.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #19 : 09-07-2007 16:31 » 

вообще, здравый смысл подсказывает, что в общем виде задача нерешаема.

1. всё делается в досе (по сути).
2. на уровне проги определить размер монитора (а именно размер физической диагонали и будет определять соотношения пикселов к дюймам) вряд ли возможно. винда это делать умеет. турбопаскакаль, очевидно - нет.

поэтому мнение предыдущего оратора (советовавшего проводить калибровку при первом запуске) следует конкретно принять во внимание Улыбаюсь

я покопаюсь, конечно... но чисто логически, я думаю, на уровне BGI отмасштабировать отрезок невозможно. ибо это зависит от физического размера монитора, который знает, в лучшем случае, только видеокарта. и то вряд ли.
Записан

vvv_1984
Гость
« Ответ #20 : 10-07-2007 07:56 » 

сам факт того что размеры монитора можно задавать вручную, туким же образом можно задавать разрешение экрана)))
Записан
vvv_1984
Гость
« Ответ #21 : 10-07-2007 08:00 » 

к примеру пользователь указал что у него 17 дюймовый монитор и разрешение 1024*768,
как мне произвести расчеты?
я понял что надо примерно посчитать скоко в 1 см пикселов, таким образом я буду строить по количеству пикселов, я не понял вот как раз как это посчитать, голова не варит((
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 10-07-2007 08:40 » 

vvv_1984,
Цитата
туким же образом можно задавать разрешение экрана)))
- это как раз элементарно определить

vvv_1984, посчитать размер ребра пиксела D можно так:

(для простоты будем считать пиксел квадратным и будем считать, что изображение пользователь не растянул, покрутив шаловливой ручкой настройки монитора, и оно (изображение) точно по границам Улыбаюсь )

теорема Пифагора =>

D^2 * (1024^2 + 768^2) == (17 * 2.54 см)^2

отсюда

D == 0,033734375 см

4 значащих разрядов будет достаточно, D==0,03373 см




« Последнее редактирование: 10-07-2007 08:55 от Алексей1153++ » Записан

vvv_1984
Гость
« Ответ #23 : 10-07-2007 10:51 » 

блин не понял !
завтра еще раз тему почитаю, голова кипит!
если еще у кого, какие нибудь идеи?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 10-07-2007 10:56 » 

vvv_1984, что ты не понял ? Вроде я нигде не ошибся
Записан

vvv_1984
Гость
« Ответ #25 : 10-07-2007 12:20 » 

vvv_1984, что ты не понял ? Вроде я нигде не ошибся
в принципе все, просто башка едет завтра мужики, скажу
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines