Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование в MFC 
:(
    Опции темы
A...
Дата 11.11.2004, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем.

Есть уравнение: y = x^3 + 2x^2 + x + 1
Нужна програмка которая бы нарисовала график этого уравнение в MFC на Dialog Base
smile

Зарание спасибо.
--------------------
Особое спасибо Русскому языку за предоставленные буквы...
PM MAIL ICQ   Вверх
Coocky
Дата 11.11.2004, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Я такие вопросы не понимаю.Ты зачем тогда учишься программировать?
Если б хотя бы спросил,а как нарисовать...
Принципиально не дам ответ,хотя работы на 20 минут smile


Это сообщение отредактировал(а) Coocky - 11.11.2004, 22:54


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
A...
Дата 11.11.2004, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да вот в этом и дело что я не знаю как именно в MFC...

А именно я написал кое-что вот.
Код

CDC *dc = GetDC();

CString n_Number;
int number, check;
int y;

m_Number.GetWindowText(n_Number);
number = atoi(n_Number);

dc->Rectangle(10,50,705,590);
dc->MoveTo(655/2, 325/2);
dc->SetPixel(715/2, 640/2, 100);

dc->MoveTo(655/2, 325/2);
if (number == 1){
 for(int x=0; x<=100; x++){
  y = x*x*x + 2*x*x + x +1;
 dc->SetPixel(x + 655/2, y + 640/2, 77);
 
 Sleep(10);
 
 
 }


но дело в том что на сколько я понял функция SetPixel принемает только значения int а мне нужно реализовать этот цикл for(int x=0; x<=10){
x = x +0,1;
}
как мне это сделать...???

Это сообщение отредактировал(а) A... - 11.11.2004, 23:04
--------------------
Особое спасибо Русскому языку за предоставленные буквы...
PM MAIL ICQ   Вверх
Mad
Дата 12.11.2004, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



A...
Тебе надо ввести понятие масштаба по осям, например

Код

CDC *dc = GetDC();

CString n_Number;
int number, check;
float y;

m_Number.GetWindowText(n_Number);
number = atoi(n_Number);

dc->Rectangle(10,50,705,590);
dc->MoveTo(655/2, 325/2);
dc->SetPixel(715/2, 640/2, 100);

dc->MoveTo(655/2, 325/2);
if (number == 1){
for(float x=0; x<=10; x+=0.1){
 y = x*x*x + 2*x*x + x +1;
dc->SetPixel((int)(x*10) + 655/2, (int)(y*10) + 640/2, 77);

Sleep(10);


Значение 10 приведенно для примера, на самом деле оно расчитывается из мин/макс значение x и y, и размера окна, в еоторое рисуеш.


--------------------
user posted image
PM MAIL   Вверх
Coocky
Дата 12.11.2004, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Ладно вышлю прогу,но завтра.Если не горит... smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
A...
Дата 12.11.2004, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ок спасибо smile
--------------------
Особое спасибо Русскому языку за предоставленные буквы...
PM MAIL ICQ   Вверх
Coocky
Дата 13.11.2004, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Я выслал тебе прогу.Оформил как положено даже где-то коментарий поставил smile
Хотел еще выбор цвета поставить и скорость рисования,но передумал,что б не для продажи. smile
Да еще,доработай сам -вместо SetPixel() делай PolygonLine() тогда линия не будет преріваться.
Эта функция в качестве параметра принимает указатель на массив точек X и Y .Массив заполнишь сам.На экран вывел показания координат,для легкости работы smile
Да и еще-это не РЕАЛЬНЫЙ график,а лишь его эмуляция(хоть и очень близкая).Господа программеры подскажите как нарисовать график y = x^3 + 2x^2 + x + 1,если уже при значении Х=10,не один монитор не спасет smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Mad
Дата 13.11.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Код

pDC->Rectangle(10,50,705,590);

float dx = 69.5f/2.f; // ширина облясти / максимальный x
float dy = 270.f/1211.0f; // высота области / y(10)
pDC->MoveTo(695/2+10, 50);
pDC->LineTo(695/2+10, 590);
pDC->MoveTo(10, 540/2+50);
pDC->LineTo(705, 540/2+50);

for(float x=0; x<=10; x+=0.1)
{
 float y = x*x*x + 2*x*x + x +1;
 pDC->SetPixel((int)(x*dx) + 695/2+10, 540/2 - (int)(y*dy)+50, RGB(255, 0, 0));
}


Можеш склонять голову smile


--------------------
user posted image
PM MAIL   Вверх
Coocky
Дата 13.11.2004, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Цитата
Можеш склонять голову

Что???Ты код запускал smile smile smile Что у тебя отобразиться???Кого ты хочешь обмануть smile Ты сделал лажу как и я-пытаешься вписаться в экран smile smile smile
Чему равно (int)(y*dy )при Х=2,даже если float dy = 270.f/1211.0f; 19??? smile Не смеши меня.Я тоже сэмулировал,но проще smile
Цитата
pDC->MoveTo(695/2+10, 50);
pDC->LineTo(695/2+10, 590);
pDC->MoveTo(10, 540/2+50);
pDC->LineTo(705, 540/2+50);

smile smile smile
предлагаю проще через массив и PolygonLine() всего 2 строчки кода smile

Это сообщение отредактировал(а) Coocky - 13.11.2004, 16:49


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Mad
Дата 13.11.2004, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Coocky
Вот тут и сказывается недостаток ОБЩЕГО образования

Цитата
Любое отображение функции является её приближением с определенной точностью


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


Цитата(Coocky @ 13.11.2004, 15:46)
Не смеши меня.Я тоже сэмулировал,но проще

Чтоб оценить, надо видеть твой код smile
Вставь его в пост.



--------------------
user posted image
PM MAIL   Вверх
Coocky
Дата 13.11.2004, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Дык я тоже подбирал числа,как и ты smile Но это не реальный график.Изменим немного числа и результат другой smile Где истина?
Ну ладно хватить спорить :плебей я без вышки никуда не пригодный.А голову не склоню-не решил ты задачу!!!!Я решил наподобии раньше см.
Цитата
Да и еще-это не РЕАЛЬНЫЙ график,а лишь его эмуляция(хоть и очень близкая).Господа программеры подскажите как нарисовать график y = x^3 + 2x^2 + x + 1,если уже при значении Х=10,не один монитор не спасет

И учусь я на курсах повышения квалификации...
Цитата
Чтоб оценить, надо видеть твой код
Вставь его в пост.

Прав нет.
Цитата
Вот тут и сказывается недостаток ОБЩЕГО образования

Обзови еще smile

Это сообщение отредактировал(а) Coocky - 13.11.2004, 17:03


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Дрон
Дата 13.11.2004, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



А в чём, собственно, задача? smile


--------------------
Да. Именно так.
PM   Вверх
Mad
Дата 13.11.2004, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Coocky
Цитата(Coocky @ 13.11.2004, 16:00)
Дык я тоже подбирал числа,как и ты

эти числа не подобранны, а расчитанны следующим образом :

Код

RECT rc; // задает область, в которой следует отобразить функцию.
float start_x, end_x; // диапозон значений X для которого отображается функция
float max_y; // максимальное значение функции в этом диапозове, для функции y = x^3+2*x^2+x+1, это будет значение функции от максимального X
float width2 = (float)(rc.right-rc.left)/2.f; // Половина ширины области, в которую отображается функция
float height2 = (float)(rc.bottom-rc.top)/2.f; // Половина высоты области, в которую отображается функция

float dx = width2/2.0f; // ширина облясти / максимальный x
float dy = height2/max_y; // высота области / y(10)


А там были уже расчитанные значения.



--------------------
user posted image
PM MAIL   Вверх
Coocky
Дата 13.11.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


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

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



Цитата
float dx = 69.5f/2.f; // ширина облясти / максимальный x
float dy = 270.f/1211.0f; // высота области / y(10)

Откуда 1211.0f?
Та думаешь я не понял,что ты в клиентской области расчитал максимальное значение по осям?
Понял.Да я то же и сделал smile Только вот отобразить достоверно- максимальное количество точек не смог(не пытался т.к задача была в другом)
Я подумал что он не может график отобразить.
Да ладно со мной все ясно smile меня.А я пойду пока готовиться к топику.Будем продолжать и заканчивать про WinSock.А также ListCtrl и многое другое.
Я безпороден это минус,но благороден это плюс....

Это сообщение отредактировал(а) Coocky - 13.11.2004, 18:41


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
A...
Дата 18.11.2004, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем еще раз..smile

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


dc->LineTo(x + r*sin((3.14/180)*beta), y + r*cos((3.14/180)*beta));



а так не работает smile
Код


xPoints[i] = x + r*sin((3.14/180)*beta);
yPoints[i] = y + r*cos((3.14/180)*beta);
kuku = xPoints[i];
popo = yPoints[i];
beta = alpha + beta;
dc->LineTo(kuku,popo);



Почему smile

Зарание спасибо.
--------------------
Особое спасибо Русскому языку за предоставленные буквы...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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