Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 161, средняя оценка - 4.93
fcrCullen93
1 / 1 / 1
Регистрация: 25.01.2011
Сообщений: 12
#1

Построение графиков элементарных функций - C++

06.10.2011, 12:50. Просмотров 22764. Ответов 17
Метки нет (Все метки)

У меня есть код, который выводит график функции тангенс х, помогите изменить его так, чтобы выводило график lnx
http://www.cyberforum.ru/cpp-beginners/thread2148061.html

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#define _WIN32_WINNT 0x0501
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <windows.h>
 
using namespace std;
 
const double Pi = 3.14159265;
 
BOOL Line(HDC hdc, int x1, int y1, int x2, int y2){
    MoveToEx(hdc, x1, y1, NULL); 
    return LineTo(hdc, x2, y2);
} 
 
string makeLine(int n){
    string str = "";
    for (int i = 0; i < n; i++){
        str+="-";
    }
    return str;
}
 
 
int main(){
    system ("color f0");
    cout << makeLine(19);
    printf("\n| x\t|y=tanh(x)|\n");
    cout << makeLine(19);   
    for (float x = -Pi+0.3f; x <= Pi; x+=1.0f) {        
        printf("\n|");
        if (x > 0)
            printf(" ");
        printf("%.2f\t|", x);
        if (tanh(x) > 0) 
            printf(" ");
        printf("%.2f\t  |", tanh(x));
            
    }
 
    //printf("\n| %.2f\t|%.2f\t  |", Pi, tanh(Pi)); 
    cout << "\n" << makeLine(19);
 
    int x = 400;
    int y = 200;
    double a = 1;
    int b = 2;
    
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << '1';
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << "          - 1";
cout << '\t';
cout << '0';
cout << "       1";
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
cout << endl;
 
 
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << '\t';
cout << "-1";
    //srand ( time(NULL) );
    HWND hWnd = GetConsoleWindow();
    HDC hDc = GetDC(hWnd);
    
    COLORREF color = RGB(0,0,0);
    HPEN pen = CreatePen(PS_SOLID,1,color);
    SelectObject(hDc,pen);
    Line(hDc,x,0,x,2*y);
    Line(hDc,100,y,2*x,y);
 
    
    COLORREF c2 = color;
    SetPixel(hDc,x+1,2,color);
    SetPixel(hDc,x+2,3,color);
    SetPixel(hDc,x+3,4,color);
 
    SetPixel(hDc,x-1,2,color);
    SetPixel(hDc,x-2,3,color);
    SetPixel(hDc,x-3,4,color);
 
    SetPixel(hDc,2*x - 2,y - 1,color);
    SetPixel(hDc,2*x - 3,y - 2,color);
    SetPixel(hDc,2*x - 4,y - 3,color);
 
    SetPixel(hDc,2*x - 2,y + 1,color);
    SetPixel(hDc,2*x - 3,y + 2,color);
    SetPixel(hDc,2*x - 4,y + 3,color);
    for(int i = 100; i < 600; i+=50){
        Line(hDc,i,y-2,i,y+2);
    }
    for(int i = 0; i < y*2; i+=45){
        Line(hDc,x-2,i+19,x+2,i+19);
    }
    for (int i = 100; i < 800; i+= 4) {
        Line(hDc,i,110,i+2,110);
    }
    for (int i = 100; i < 800; i+= 4) {
        Line(hDc,i,290,i+2,290);
    }
    for(double x1 = -250; x1 < 250; x1++){
        double y1 = tanh(x1/100.0) * 90;
        SetPixel(hDc, x1 + x, y - y1, color);
    }
 
    int xD;
    cin >> xD;
    
    ReleaseDC(hWnd, hDc);
    return 0;   
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2011, 12:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Построение графиков элементарных функций (C++):

Написать програму для подсчета элементарных функций
&quot;Написать програму для подсчета элементарных функций&quot; - это все задание...

Печать значений элементарных функций по формуле Тейлора!
http://i043.***********/0912/82/fa0b56f41821.jpg Помогите пожалуйста...

Заменить значения членов массива на значение одной из элементарных функций
Заменить значения членов массива на значение одной из элементарных функций,...

Построение графиков
Спасибо всем заранее,кто откликнулся!!! Помогите, пожалуйста построение...

построение графиков в С++
Доброго времени суток. Столкнулась с такой проблемой: нужно построить лежащую...

17
-=ЮрА=-
Заблокирован
Автор FAQ
06.10.2011, 16:49 #2
Лучший ответ Сообщение было отмечено как решение

Решение

Я привожу код строящий cos(x), используя всю плоскость окна консоли(для этого снабдил проект функциями масштабирования). Думаю подогнать под проект труда не составит
Код программы
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <windows.h>
#include <stdio.h>
#include <math.h>
 
#define RED RGB(255,0,0)
#define GRN RGB(0,255,0)
#define BLU RGB(0,0,255)
 
#define BLK RGB(0,0,0)
#define WHT RGB(255,255,255)
 
HPEN  getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF);
BOOL  SetPoint(HDC hDC, HPEN hPen, COORD PNT);
BOOL  PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END);
//Функция график которой строим
double f(double x){return cos(x);}
double * mf(double a, double b, double n)
{
    double x = a;
    double h = (b - a)/n;
    double vec[2];
    vec[0] = f(a);
    vec[1] = f(a);
    while(x < b)
    {
        if(vec[1] < f(x))
            vec[1] = f(x);
        if(f(x) < vec[0])
            vec[0] = f(x);
        x += h;
    }
    return &vec[0];
}
 
int main()
{
    long n;
    double a = 0, b = 0,x, dx, *vec;
    double CX, CY;
    
    HWND    hWnd = GetForegroundWindow();
    HPEN    RPEN = getPen(PS_SOLID, 2, RED);
    HPEN    GPEN = getPen(PS_SOLID, 2, GRN);
    HPEN    BPEN = getPen(PS_SOLID, 2, BLU);
    HPEN    WPEN = getPen(PS_SOLID, 3, WHT);
    RECT    pRECT= {0};
    COORD   BGN  = {0};
    COORD   END  = {0};
    GetClientRect(hWnd,&pRECT);
    
    HDC hDC = GetWindowDC(hWnd);
 
    printf("\tPloting f(x) = ln(x)\r\n");
    printf("Enter diapasone [a;b]\r\n");
    printf("a = ");scanf("%lf",&a);
    printf("b = ");scanf("%lf",&b);
    printf("Enter number of points\r\n");
    printf("n = ");scanf("%u",&n);
    vec = mf(a, b, n);//Нужно знать макс и мин для масштабирования
    if(hDC)
    {
        CX = (b - a)/(pRECT.right - pRECT.left);
        CY = (vec[1] - vec[0])/(pRECT.bottom - pRECT.top);
        
        x = a;dx = (b - a)/n;
        BGN.X = x   /CX;
        BGN.Y = f(x)/CY + (pRECT.bottom - pRECT.top)/2;
        SetBkMode(hDC,TRANSPARENT);
        SetPoint (hDC, WPEN, BGN);
        while(x < b)
        {
            END.X = x   /CX;
            END.Y = f(x)/CY + (pRECT.bottom - pRECT.top)/2;
            PlotLine(hDC, RPEN, BGN, END);
            SetPoint (hDC,WPEN, END);
            BGN = END;
            x += dx;
        }
    }
    system("pause");
    return 0;
}
 
HPEN getPen(int iPEN_STYLE, int iPEN_SIZE, int iCOLORREF)
{
        return CreatePen(iPEN_STYLE, iPEN_SIZE, iCOLORREF);
}
 
BOOL SetPoint(HDC hDC, HPEN hPen, COORD PNT)
{
        EXTLOGPEN pINFO;
        GetObject(hPen,sizeof(EXTLOGPEN),&pINFO);
        SelectObject(hDC,hPen);
        return Ellipse
        (
                hDC,
                PNT.X - pINFO.elpWidth,
                PNT.Y + pINFO.elpWidth, 
                PNT.X + pINFO.elpWidth,
                PNT.Y - pINFO.elpWidth
        );
}
 
BOOL PlotLine(HDC hDC, HPEN hPen, COORD BGN, COORD END)
{
        SelectObject(hDC,hPen);
        MoveToEx(hDC,BGN.X,BGN.Y,NULL);
        return LineTo(  hDC,END.X,END.Y);
}
5
Миниатюры
Построение графиков элементарных функций  
-=ЮрА=-
Заблокирован
Автор FAQ
06.10.2011, 17:01 #3
PS: Для построения f(x) = ln(x) в моём коде достаточно провести такую замену
C++
1
double f(double x){return log(x);}
Только диапазон построения нужно с умом выбирать!

Не по теме:

помним что в точке х=0 ln(0) - НЕОПРЕДЕЛЁН и об ОДЗ ln(x) нужно помнить т.е. x > 0

1
Миниатюры
Построение графиков элементарных функций  
Артёмий
0 / 0 / 0
Регистрация: 11.06.2012
Сообщений: 3
12.06.2012, 00:58 #4
-=ЮрА=-, не поминаю как построить можешь пожалуйста сделать весь код программы синусоиды
0
-=ЮрА=-
Заблокирован
Автор FAQ
12.06.2012, 07:11 #5
Цитата Сообщение от Артёмий Посмотреть сообщение
-=ЮрА=-, не поминаю как построить можешь пожалуйста сделать весь код программы синусоиды
Артемий, ты пробовал нажать мышкой на эту надпись?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Код программы
0
Миниатюры
Построение графиков элементарных функций  
t668
0 / 0 / 1
Регистрация: 14.05.2013
Сообщений: 7
04.06.2013, 09:28 #6
надо написать программу построения графика функции cos x^2 на вижуал 10-12 С++
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.06.2013, 09:37 #7
t668, ты вообще чтоли безрукий?
вот эту строку
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
double f(double x){return cos(x);}
- запиши вот так
double f(double x){return pow(cos(x), 2.0);}
- и всё больше ничего трогать не надо.

Не по теме:

Чертовски злит и убивает, когда человек даже в таком примитиве не способен разобраться

1
t668
0 / 0 / 1
Регистрация: 14.05.2013
Сообщений: 7
16.06.2013, 18:43 #8
А диапазон построения какой?
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 19:00 #9
Цитата Сообщение от t668 Посмотреть сообщение
А диапазон построения какой?
- любой который введёшь, даже ввод сделан
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
printf("\tPloting f(x) = ln(x)\r\n");
* * printf("Enter diapasone [a;b]\r\n");
* * printf("a = ");scanf("%lf",&a);
* * printf("b = ");scanf("%lf",&b);
* * printf("Enter number of points\r\n");
* * printf("n = ");scanf("%u",&n);
- что ещё можно пояснять?
0
t668
0 / 0 / 1
Регистрация: 14.05.2013
Сообщений: 7
16.06.2013, 19:31 #10
просто при вводе станд
0.0001
6
20, выводит не cos x во2

и ещё

написанный на С?
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 21:07 #11
Цитата Сообщение от t668 Посмотреть сообщение
просто при вводе станд
0.0001
6
20, выводит не cos x во2
- а 6 и 20 ты вводишь как градусы?Ввод сделан под радианы, 6 градусов это PI*6/180 = PI/30 радиан
0
t668
0 / 0 / 1
Регистрация: 14.05.2013
Сообщений: 7
16.06.2013, 21:28 #12
посоветуйте лучший вариант
a =
b =

n =
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.06.2013, 21:39 #13
0
6,28
50
0
monk22092011
0 / 0 / 1
Регистрация: 20.11.2013
Сообщений: 37
21.11.2013, 23:33 #14
[QUOTE=-=ЮрА=-;4729905] прости пожалуйста, а можно как то твой код в класс вкинуть?
что нужно добавить?..

Добавлено через 7 минут
прости пожалуйста, а можно как то твой код в класс вкинуть?
что нужно добавить?..
0
-=ЮрА=-
Заблокирован
Автор FAQ
22.11.2013, 21:02 #15
Сделай функции из кода методами класса, перменные из кода сделай его полями.
2
monk22092011
0 / 0 / 1
Регистрация: 20.11.2013
Сообщений: 37
24.11.2013, 22:53 #16
а ты не мог бы помочь мне с этим?
если не трудно, пожалуйста
я не очень понимаю этот язык
0
f1ff
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
22.04.2015, 22:21 #17
-=ЮрА=-, помоги, пожалуйста, исправить эту процедуру.
Надо чтобы график y=x^2 был плавным.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
LRESULT CALLBACK WndProc(HWND hWnd,  UINT iMsg,  WPARAM wParam,  LPARAM lParam)
{
    HDC             hDC;
    PAINTSTRUCT     ps;
 
    static Point    center;
    static int      cxClient,  cyClient;
    const double    scale = 2;  
 
    
    switch (iMsg)
    {
        case WM_SIZE:
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
 
            center.x = cxClient/2;
            center.y = cyClient/2;
 
            return 0;
 
 
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
 
            // Ось X
            MoveTo(hDC, 0, cyClient/2);
            LineTo(hDC, cxClient, cyClient/2);
 
            // Ось Y
            MoveTo(hDC, cxClient/2, 0);
            LineTo(hDC, cxClient/2, cyClient);
            
            // Рисуем y = x^2
            // Правая ветвь
            MoveTo(hDC, center.x, center.y);
            for (int x=center.x;  x<cxClient;  ++x)
            {
                LineTo(hDC, x, center.y - (x-center.x)*(x-center.x) );
            }
 
            // Левая ветвь
            MoveTo(hDC, center.x, center.y);
            for (int x=center.x;  x>=0;  --x)
            {
                LineTo(hDC, x, center.y - (center.x-x)*(center.x-x) );
            }
 
 
            EndPaint(hWnd, &ps);
            return 0;
 
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
 
 
    return DefWindowProc(hWnd, iMsg, wParam, lParam);
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.04.2015, 18:59 #18
Цитата Сообщение от f1ff Посмотреть сообщение
for (int x=center.x; *x<cxClient; *++x)
- шаг единица потому и неплавно, сделай шаг хотя бы 0,1
1
23.04.2015, 18:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2015, 18:59
Привет! Вот еще темы с решениями:

Построение графиков в окошке
Здравствуйте! Хочу написать программу на C++ — небольшая формочка с полями...

Построение графиков функции
Здравствуйте. нужно написать программу по данной формуле..вот скриншот P.S...

Построение графиков по массивам данных
Добрый вечер! Идея вот в чём, сначала производятся какие-то расчёты в...

Как инвертировать ось у в построение графиков
Проблема в следующем, я не знаю как инверитровать ось у в с++, у меня строит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru