Что нового

[Математика] Построение графика функции

untento

Новичок
Сообщения
7
Репутация
0
Здравствуйте уважаемые обитатели форума! Помогите построить график с помощью GraphGDIPlus. График должен выйти приблизительно таким (см. вложение), в графике салатовая и зеленая прямые линии должны проходить через точку пересечения синей и оранжевой прямой.
Код.
Код:
#include "GraphGDIPlus.au3"
#NoTrayIcon
Global $Um, $Rn, $Cf, $f, $k2, $k3, $R1rt, $R2rt, $ktr, $In, $Rtr, $kp, $Ucr, $Ud1, $Ud2, $Ar, $M, $Ov ;здесь могут быль лишние переменные

$GUI = GUICreate("Точка",590,530)

$start = GUICtrlCreateButton("Пересчитать", 470, 460, 97, 33)

$filemenu = GUICtrlCreateMenu("&Справка")
$fileitem = GUICtrlCreateMenuItem("О программе", $filemenu)

$Um00 = GUICtrlCreateInput("100", 10, 298, 40, 20)
GUICtrlCreateLabel("Постоянный расходы, руб.", 55, 300, 190, 17)

$Rn00 = GUICtrlCreateInput("1", 10, 323, 40, 20)
GUICtrlCreateLabel("Переменные расходы на единицу продукции, руб.", 55, 325, 190, 17)

$Cf00 = GUICtrlCreateInput("5", 10, 348, 40, 20)
GUICtrlCreateLabel("Цена единицы, руб.", 55, 350, 190, 17)

$f00 = GUICtrlCreateInput("500", 10, 373, 40, 20)
GUICtrlCreateLabel("Объем реализации, шт.", 55, 375, 360, 17)



_Read()

GUICtrlCreateLabel('', 250, 303, 1, 110 ,0x11)
$Label_In = GUICtrlCreateLabel('', 260, 300, 190, 17)
$Label_Rtr = GUICtrlCreateLabel('', 260, 325, 190, 17)
$Label_kp = GUICtrlCreateLabel('', 260, 350, 190, 17)
$Label_Ucr = GUICtrlCreateLabel('', 260, 375, 250, 17)
GUICtrlSetColor( -1, 0xFF0000)
$Label_Ud1 = GUICtrlCreateLabel('', 260, 400, 250, 17)
GUICtrlSetColor( -1, 0xFF0000)
$Label_Vm = GUICtrlCreateLabel('', 10, 400, 190, 17)
$Label_Ov = GUICtrlCreateLabel('', 10, 425, 190, 17)

; Создание окна диаграммы
$Graph = _GraphGDIPlus_Create($GUI,40,10,530,260,0xFF000000,0xFFCEE3E0)

;отрисовка графиков при старте

_start()

GUISetState ()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $start
            _Read()
            _start()
		Case $msg = $fileitem
			MsgBox (0, "О программе", "Точка"&@CRLF&"© bahooo, 2013. All rights reserved")
        Case $msg = -3
            Exit
    EndSelect
WEnd

Func _Read() 
$Um = GUICtrlRead($Um00) ;постоянные расходы
$Rn = GUICtrlRead($Rn00) ;переменные расходы на единицу
$Cf = GUICtrlRead($Cf00) ;цена единицы
$f = GUICtrlRead($f00) ;объем реализации

$In=$Cf*$f 			;выручка
$Rtr=$Um+($Rn*$f) 	;общие расходы
$kp=$In-$Rtr 		;прибыль
$Ucr=$Um/($Cf-$Rn) 	;мин. объем реализации
$Ud1=$Um+($Rn*$Ucr) ;мин. общие расходы
$M=$kp+$Um 			;валовая маржа
$Ov=$M/$kp 			;операционный рычаг

EndFunc

Func _start()
_GraphGDIPlus_Clear($Graph)
;----- шкала по оси XY
_GraphGDIPlus_Set_RangeX($Graph,0,20,10,1,0)
_GraphGDIPlus_Set_RangeY($Graph,0,$Um*1.1,10,1,1)

;----- сетка по оси XY
_GraphGDIPlus_Set_GridX($Graph,1,0xFF6993BE)
_GraphGDIPlus_Set_GridY($Graph,$Um*1.1/10,0xFF6993BE)
_GraphGDIPlus_Set_PenSize($Graph,1)

; цвет графиков
_Draw_Graph3(0xFF339966)
_Draw_none() ; обход графика за пределами окна, так как графики рисует одна линия
_Draw_Graph31(0xFF800080)
_Draw_none() ; обход
_Draw_Graph2(0xFFFF6600)
_Draw_none() ; обход
_Draw_Graph1(0xFF0000FF)
_Draw_none() ; обход
_GraphGDIPlus_Refresh($Graph)
; установка параметров после пересчёта
GUICtrlSetData($Label_In,'Выручка '&$In&' руб.')
GUICtrlSetData($Label_Rtr,'Общие расходы '&$Rtr&' руб.')
GUICtrlSetData($Label_kp,'Прибыль '&Round ($kp, 2)&' руб.')
GUICtrlSetData($Label_Ucr,'Минимальный объем реализации '&Round ($Ucr, 1)&' шт.')
GUICtrlSetData($Label_Ud1,'Минимальние расходы '&Round ($Ud1, 2)&' руб.')
GUICtrlSetData($Label_Vm,'Валовая маржа '&$M&' руб.')
GUICtrlSetData($Label_Ov,'Операцыонный рычаг '&Round ($Ov, 2)&' руб.')

EndFunc

Func _Draw_none()
    _GraphGDIPlus_Plot_Line($Graph,21,-1)
    _GraphGDIPlus_Plot_Line($Graph,-1,-1)
EndFunc

Func _Draw_Graph1($ColorGr)
    _GraphGDIPlus_Set_PenColor($Graph,$ColorGr)
    For $i = 0 to 20
        $yy=$i*3.14/20
        $U1=$Um*Sqrt(Cos($yy)^2)*$kp
        _GraphGDIPlus_Plot_Line($Graph,$i,$U1)
    Next
EndFunc

Func _Draw_Graph2($ColorGr)
    _GraphGDIPlus_Set_PenColor($Graph,$ColorGr)
    For $i = 0 to 20
        $tt=50*$i/$f
        $U2=$Um*Exp(-1000*$tt/($Rn*$Cf))*$kp+$k2
        _GraphGDIPlus_Plot_Line($Graph,$i,$U2)
    Next
EndFunc

Func _Draw_Graph3($ColorGr)
    _GraphGDIPlus_Set_PenColor($Graph,$ColorGr)
    For $i = 0 to 20
        $tt=50*$i/$f
        $yy=$i*3.14/20
        $U3=($Um-1000*$Um*$tt/($Rn*$Cf)+$k3)*$kp
        _GraphGDIPlus_Plot_Line($Graph,$i,$U3)
    Next
EndFunc

Func _Draw_Graph31($ColorGr)
    _GraphGDIPlus_Set_PenColor($Graph,$ColorGr)
    For $i = 0 to 20
        $tt=50*$i/$f
        $U31=(Cos($Ar)-Sin($Ar)*($tt*3.14/10-$Ar))*$Um*$kp
        _GraphGDIPlus_Plot_Line($Graph,$i,$U31)
    Next
EndFunc

P.S. За основу был взят этот пример
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
несомненно, это все можно сделать в AutoIt, но я бы лично порекомендовал мат пакеты заточенные под такие нужды. время сократиться на 99%. к примеру matlab. но он непомерно дорогой для отдельно взятого человека. только если есть лицензия от организации типа универа. поэтому Scilab - аналог, но бесплатный.
 

cnm

Новичок
Сообщения
58
Репутация
2
Согласен с предыдущим сообщением. Можно все делать через жопу, но лучше делать теми инструментами, которые для этого предназанчены.


Тебе надо график? Именно картинку по данным?
Тогда тебе даже не матлаб нужен, а простой ексел.
 
Автор
U

untento

Новичок
Сообщения
7
Репутация
0
Спасибо ребята что откликнулись!
Чтоб не создавать проблем себе и вам, решил отказаться от графиков в силу сложной реализации этого средствами AutoIt.
Мне нужно было реализовать постройку графиков (не картинки) в одной программе, не привлекая сторонних средств.
Еще раз благодарю за внимание :IL_AutoIt_1:
 
Верх