Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2022, 09:45   #31
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Только dRate у вас должно быть 4 значения и вот такие: 0, 0.1, 0.75, 1.0
macomics вне форума Ответить с цитированием
Старый 12.10.2022, 09:47   #32
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Странно, но я хоте прямоугольник 3х3, а не того монстра, что в итоге получился. Если я задаю параметры функции построения прямоугольника, как Rectange(hdc, (rcArc.left + pCenter.x + x0 + x) / 3, (rcArc.top + pCenter.y + y0 + y) / 3, 3, 3), то я хочу получить фигуру прямоугольника с шириной и высотой как задал, а не то, что получилось, если координата левого угла это 10, а верх 5, то в итоге я хочу получить правый нижний угол = 13, 8, а никак не 7, 2.
Так вы у прямоугольника задаете не ширину и высоту, а координаты. Для прямоугольника 3х3 надо сделать так: Rectangle(x, y, x + 3, y + 3);

Цитата:
Сообщение от apofioz Посмотреть сообщение
Сейчас создал, теперь закрашивается всё окно, как вы понимаете это не тот результат, которого я ожидал.
Значит у границы есть разрывы. Как вариант можете попробовать увеличить ширину контура у пера. CreatePen(PS_SOLID, 2, COLORREF(255, 255, 255));

Последний раз редактировалось macomics; 12.10.2022 в 09:52.
macomics вне форума Ответить с цитированием
Старый 12.10.2022, 10:04   #33
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Только dRate у вас должно быть 4 значения и вот такие: 0, 0.1, 0.75, 1.0
А нуль зачем? Начинать цикл с 0 нужно или с 1?

Цитата:
Сообщение от macomics Посмотреть сообщение
Так вы у прямоугольника задаете не ширину и высоту, а координаты. Для прямоугольника 3х3 надо сделать так: Rectangle(x, y, x + 3, y + 3);
Делал, но он получается не 3х3, а такой же огромный, только растёт в другом, правильном, направлении.


Цитата:
Сообщение от macomics Посмотреть сообщение
Значит у границы есть разрывы. Как вариант можете попробовать увеличить ширину контура у пера. CreatePen(PS_SOLID, 2, COLORREF(255, 255, 255));
Не знаю, может быть и есть разрывы, но получается так.
Окно2.jpg
apofioz вне форума Ответить с цитированием
Старый 12.10.2022, 10:31   #34
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
А нуль зачем? Начинать цикл с 0 нужно или с 1?
Я не это хотел показать. Вам надо задавать массив откладывая % от предыдущего уровня. Уровень определяется суммой предыдущего уровня и текущего значения. Поэтому первой точкой идет 0, второй точкой идет 0 + 10% = 0.1, третьей - 10% + 65% = 0.75, и последняя - 75% + 25% = 1.0

Цитата:
Сообщение от apofioz Посмотреть сообщение
Делал, но он получается не 3х3, а такой же огромный, только растёт в другом, правильном, направлении.
Если бы сделали правильно так как я сформулировал, тогда прямоугольник был бы 3х3 пикселя.

Цитата:
Сообщение от apofioz Посмотреть сообщение
Не знаю, может быть и есть разрывы, но получается так.
А код можно увидеть?
macomics вне форума Ответить с цитированием
Старый 12.10.2022, 11:12   #35
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Я не это хотел показать.
Т.е. такие значения вполне подходят {0.1, 0.75, 1.0}, если без вычислений.


Цитата:
Сообщение от macomics Посмотреть сообщение
Если бы сделали правильно так как я сформулировал, тогда прямоугольник был бы 3х3 пикселя.
И что я сделал не правильно, что не так, я параметры задал так как было указано.


Цитата:
Сообщение от macomics Посмотреть сообщение
А код можно увидеть?
Да, тот цикл который я ранее выложил плюс прежняя инициализация значений, которые требуются при вычислениях.
Код:
COLORREF iColor[3] = { RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255) };

double dRate[] = { 0.1, 0.75, 1.0 };
const TCHAR* szSizer[] = { TEXT("10 %"), TEXT("65 %"), TEXT("25 %") };

hPen[0] = CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
		hPen[1] = (HPEN)SelectObject(hdc, hPen[0]);
		RECT rcArc;
		int cxHalfClient = (cxClient >> 1);
		int cyHalfClient = (cyClient >> 1);

		int cxHalfEllipse = (cxEllipse >> 1);
		SetRect(&rcArc, cxHalfClient - cxHalfEllipse,
			cyHalfClient - 100,
			cxHalfClient + cxHalfEllipse,
			cyHalfClient + 100);
		cyEllipse = rcArc.bottom - rcArc.top;

		POINT pCenter = { ((rcArc.left + rcArc.right) >> 1),
						 ((rcArc.top + rcArc.bottom) >> 1)
		};

int x0 = rcArc.left + (int)round(0.5 * cxEllipse);
		int y0 = rcArc.top + cyEllipse;
		for (int i = 0; i < 3; ++i)
		{
			hPen[0] = CreatePen(PS_SOLID, 1, iColor[i]);
			hBrush[0] = CreateSolidBrush(iColor[i]);
			hPen[1] = (HPEN)SelectObject(hdc, hPen[0]);
			hBrush[1] = (HBRUSH)SelectObject(hdc, hBrush[0]);
			int x = rcArc.left + round(0.5 * cxEllipse * cos(2 * PI * dRate[i]));
			int y = rcArc.top - round(0.5 * cyEllipse * sin(2 * PI * dRate[i]));

			Arc(hdc, rcArc.left, rcArc.top, rcArc.right, rcArc.bottom, x0, y0, x, y);
			MoveToEx(hdc, pCenter.x, pCenter.y, NULL);
			LineTo(hdc, x, y);

			x0 = x;
			y0 = y;
			x = rcArc.left + round(0.5 * cxEllipse * cos(2 * PI * dRate[i + 1]));
			y = rcArc.top - round(0.6 * cyEllipse * sin(2 * PI * dRate[i + 1]));

			TextOut(hdc, x, y, szSizer[i], 4);
		}
Остальной код типичный, но если надо выложу.
apofioz вне форума Ответить с цитированием
Старый 12.10.2022, 15:06   #36
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
			Arc(hdc, rcArc.left, rcArc.top, rcArc.right, rcArc.bottom, x0, y0, x, y);
			MoveToEx(hdc, pCenter.x, pCenter.y, NULL);
			LineTo(hdc, x, y);
Не удивительно. Ваша фигура ограничена 2-я линиями. От центра до конца дуги и собственно дугой. Она не имеет замкнутого одноцветного контура.

Цитата:
Сообщение от apofioz Посмотреть сообщение
И что я сделал не правильно, что не так, я параметры задал так как было указано
https://www.programmersforum.ru/show...9&postcount=32
Я вам показал так: Rectangle(x, y, x + 3, y + 3);
Вы сделали так: Rectangle(x, y, 3, 3);
macomics вне форума Ответить с цитированием
Старый 13.10.2022, 04:03   #37
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
От центра до конца дуги и собственно дугой. Она не имеет замкнутого одноцветного контура.
Если добавить прямую от центра до начала дуги, то всё должно заработать? Но дело в том, что тот код, который строил фигуру т.е. код, который был изначально я удалил, а новый код, который в цикле обрабатывает инструкции и который я выложил выше не работает. Строит сегменты не верно, линии от центра к концу дуги проводит не совсем точно в расчётах проблема или нет я понять не могу.


Цитата:
Сообщение от macomics Посмотреть сообщение
Я вам показал так: Rectangle(x, y, x + 3, y + 3);
Я вам сказал, что я так пробовал.
apofioz вне форума Ответить с цитированием
Старый 13.10.2022, 07:20   #38
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Я вам сказал, что я так пробовал.
Не знаю где это было. Перечитал все с начала. Вы показывали только код, который я показал:
Код:
Rectangle(hdc, x, y, 3, 3);
И у вас постоянно так написано. Я вам говорю, что надо так
Код:
Rectangle(hdc, x, y, x + 3, y + 3);

Цитата:
Сообщение от apofioz Посмотреть сообщение
Если добавить прямую от центра до начала дуги, то всё должно заработать? Но дело в том, что тот код, который строил фигуру т.е. код, который был изначально я удалил, а новый код, который в цикле обрабатывает инструкции и который я выложил выше не работает. Строит сегменты не верно, линии от центра к концу дуги проводит не совсем точно в расчётах проблема или нет я понять не могу.
А что мешает в цикл добавить еще один вызов LineTo?
macomics вне форума Ответить с цитированием
Старый 13.10.2022, 07:55   #39
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Не знаю где это было. Перечитал все с начала. Вы показывали только код, который я показал:
Цитата:
Сообщение от macomics Посмотреть сообщение
И у вас постоянно так написано. Я вам говорю, что надо так
Я приводил пример кода, тогда это выглядело так:
Код:
Rectangle(hdc, (pCenter.x + x + x0) / 3, (pCenter.y + y + y0) / 3, (pCenter.x + x + x0) / 3 + 3, (pCenter.y + y + y0) / 3 + 3);
Только параметры были несколько другие, но суть та же.


Цитата:
Сообщение от macomics Посмотреть сообщение
А что мешает в цикл добавить еще один вызов LineTo?
))Добавлял, происходит следующее, после прорисовки первого сегмента, красного, область сегмента действительно закрашивается, но после перехода к реализации и прорисовке второго сегмента, зелёного, закрашивается всё окно зелёным, затем тоже происходит и с синим сегментом. Вторую линию провожу от центра, до точки x0, y0.
Для наглядности.

Окно3.png

Окно5.png

Окно6.png
Значит, зелёная область-сегмент всё ещё имеет разрывы?
apofioz вне форума Ответить с цитированием
Старый 13.10.2022, 08:00   #40
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так посмотрите куда вы попадаете точкой закрашивания, когда выводите зеленый сегмент. Она у вас вне закрашиваемой области получается при использовании этих формул. Я об этом говорил. Все потому, что область больше 50%. И формулы эти я приводил для примера.

Последний раз редактировалось macomics; 13.10.2022 в 08:02.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать круговую диаграмму Proskurina Паскаль, Turbo Pascal, PascalABC.NET 2 08.11.2012 08:50
Нарисовать столбиковую диаграмму по результатам сдачи экзамена по матану Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 07.11.2012 23:14
Нарисовать столбиковую диаграмму Proskurina Помощь студентам 2 24.10.2012 13:40
Нарисовать диаграмму сравнения методов Gebbellz Помощь студентам 0 15.12.2010 17:52
нарисовать круговую диаграмму в паскале vbchristy46 Помощь студентам 2 28.06.2010 20:33