涵林同学
2019-02-27 19:21
采纳率: 100%
浏览 2.5k

江湖救急!求C语言输出正弦函数图像代码(要画坐标轴)

正弦曲线函数
设计一个正弦曲线函数,当调用该函数时,可以打印出幅值、频率、相位、线型均可调 的正弦曲线,具体要求:
1. 幅值、频率、相位、线型分别是该函数的输入参数;
2. 需要有主函数调用该函数,主函数只负责获得正弦曲线函数的输入参数。
3. 需要显示出坐标轴以及刻度
如下图

图片说明

朋友突然甩给我一个课设题目说明天就要交了,奈何自己太菜了做不出来啊...救救孩子吧

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • maxos 2019-03-05 22:48
    已采纳

    实在没有 C 币了,求一点 C 币。
    图片说明

    完整源代码下载链接: https://pan.baidu.com/s/14mTPTMBEmQN_A84t4XUgWg
    提取码: y6nv

    关键代码:

    BOOL CDrawImageDlg::OnEraseBkgnd(CDC* pDC)
    {
        CDialogEx::OnEraseBkgnd(pDC);
        if (pDC == NULL)
        {
            return true;
        }
    
        // 从编辑框取值:
        std::wstring wsRangeX = GetEditText(IDC_EDIT4);
        std::wstring wsRangeY = GetEditText(IDC_EDIT5);
        std::wstring wsDrawLeft = GetEditText(IDC_EDIT6);
        std::wstring wsDrawTop = GetEditText(IDC_EDIT7);
        std::wstring wsDrawRight = GetEditText(IDC_EDIT8);
        std::wstring wsDrawBottom = GetEditText(IDC_EDIT9);
    
        // 定义
        float fRangeX = (float)wcstof(wsRangeX.c_str(), NULL);
        float fRangeY = (float)wcstof(wsRangeY.c_str(), NULL);
    
        // x轴与 y轴的起始量:
        int nStartX = (int)wcstol(wsDrawLeft.c_str(), NULL, 10);
        int nStartY = (int)wcstol(wsDrawTop.c_str(), NULL, 10);
    
        // X轴与Y轴的绘制区域,防止画出界:
        int nRangeWidth = (int)wcstol(wsDrawRight.c_str(), NULL, 10);
        int nRangeHeight = (int)wcstol(wsDrawBottom.c_str(), NULL, 10);
    
        // 计算坐标中心点:
        int nBaseX = nStartX + (nRangeWidth ) / 2;
        int nBaseY = nStartY + (nRangeHeight) / 2;
    
        // 计算单个刻度需要跨多少像素(X轴):
        float fPixelX = ((float)nRangeWidth / (fRangeX*2.0f));
        // 计算单个刻度需要跨多少像素(Y轴):
        float fPixelY = ((float)nRangeHeight / (fRangeY*10.0f*2.0f));
    
        // 画坐标轴:
        {
            // 绘制外框:
            pDC->Rectangle(nStartX, nStartY, nStartX + nRangeWidth, nStartY+nRangeHeight);
    
            // 绘制X轴基线(坐标轴)
            pDC->MoveTo(nStartX, nBaseY);
            pDC->LineTo(nStartX+nRangeWidth, nBaseY);
    
            // 绘制Y轴基线(坐标轴)
            pDC->MoveTo(nBaseX, nStartY);
            pDC->LineTo(nBaseX, nStartY+nRangeHeight);
    
            // 绘制刻度(+X轴):
            float i = 0.0f, x = 0.0f, y = 0.0f;
            for (i = 0.0f; i < (float)fRangeX; i += 1.0f)
            {
                int nLen = 4;
                x = ((float)nBaseX + (fPixelX*(float)i));
                int xPos = (int)x;
                pDC->MoveTo(xPos, nBaseY);
                if (((int)i % 5) == 0)
                {
                    wchar_t wsText[8] = L"";
                    wsprintf(wsText, L"%d", (int)i);
                    pDC->TextOutW(xPos, nBaseY+3, wsText, wcslen(wsText));
                    pDC->LineTo(xPos, nBaseY - nLen * 2);
                }
                else
                {
                    pDC->LineTo(xPos, nBaseY - nLen);
                }
            }
            // 绘制刻度(-X轴):
            i = 0.0f, x = 0.0f;
            for (i = 0.0f; i < (float)fRangeX; i += 1.0f)
            {
                int nLen = 4;
                x = ((float)nBaseX - (fPixelX*(float)i));
                int xPos = (int)x;
                pDC->MoveTo(xPos, nBaseY);
                if (((int)i % 5) == 0)
                {
                    if ((int)i != 0)
                    {
                        // '0'在画正坐标轴时画过了。
                        wchar_t wsText[8] = L"";
                        wsprintf(wsText, L"-%d", (int)i);
                        pDC->TextOutW(xPos, nBaseY + 3, wsText, wcslen(wsText));
                    }
                    pDC->LineTo(xPos, nBaseY - nLen * 2);
                }
                else
                {
                    pDC->LineTo(xPos, nBaseY - nLen);
                }
            }
            // 绘制刻度(+Y轴):
            i = 0.0f, y = 0.0f;
            for (i = 0.0f; i < (float)(fRangeY*10.0f); i += 1.0f)
            {
                int nLen = 4;
                y = ((float)nBaseY - (fPixelY*(float)i));
                int yPos = (int)y;
                pDC->MoveTo(nBaseX, yPos);
                if (((int)i % 5) == 0)
                {
                    if ((int)i != 0)
                    {
                        wchar_t wsText[8] = L"";
                        swprintf(wsText, L"%.1f", i / 10.0f);
                        // 文字向右移 2 像素:
                        pDC->TextOutW(nBaseX + nLen * 2 + 2, yPos, wsText, wcslen(wsText));
                    }
                    pDC->LineTo(nBaseX + nLen * 2, yPos);
                }
                else
                {
                    pDC->LineTo(nBaseX + nLen, yPos);
                }
            }
            // 绘制刻度(-Y轴):
            i = 0.0f, y = 0.0f;
            for (i = 0.0f; i < (float)(fRangeY*10.0f); i += 1.0f)
            {
                int nLen = 4;
                y = ((float)nBaseY + (fPixelY*(float)i));
                int yPos = (int)y;
                pDC->MoveTo(nBaseX, yPos);
                if (((int)i % 5) == 0)
                {
                    if ((int)i != 0)
                    {
                        wchar_t wsText[8] = L"";
                        swprintf(wsText, L"-%.1f", (i/10.0f));
                        // 文字向右移 2 像素:
                        pDC->TextOutW(nBaseX + nLen * 2 + 2, yPos, wsText, wcslen(wsText));
                    }
                    pDC->LineTo(nBaseX + nLen * 2, yPos);
                }
                else
                {
                    pDC->LineTo(nBaseX + nLen, yPos);
                }
            }
        }
    
        // 绘制算法图像:
        {
            float fX = 0.0f, fY = 0.0f;
    
            // 绘制正坐标轴上的图像:
            int nFirstPoint = 0;
            for (fX = 0.0f; fX <= (fRangeX); fX += 0.02f)
            {
                // 计算数值:
                float fSinXValue = sinf(fX);
    
                // Y 坐标对齐 Y 轴刻度:
                float fRealY = (nRangeHeight / 2.0f)*fSinXValue / fRangeY;
    
                // 绘制到屏幕上:
                int x = nBaseX + (int)(fX*fPixelX);
                int y = nBaseY - (int)fRealY;
    
                if (nFirstPoint == 0)
                {
                    pDC->MoveTo(x, y);
                    nFirstPoint = 1;
                }
                pDC->LineTo(x, y);
            }
    
            // 绘制负轴上的图像:
            nFirstPoint = 0;
            for (fX = 0.0f; fX >= (-fRangeX); fX -= 0.02f)
            {
                // 计算数值:
                float fSinXValue = sinf(fX);
    
                // Y 坐标对齐 Y 轴刻度:
                float fRealY = (nRangeHeight / 2.0f)*fSinXValue / fRangeY;
    
                // 绘制到屏幕上:
                int x = nBaseX + (int)(fX*fPixelX);
                int y = nBaseY - (int)fRealY;
    
                if (nFirstPoint == 0)
                {
                    pDC->MoveTo(x, y);
                    nFirstPoint = 1;
                }
                pDC->LineTo(x, y);
            }
        }
        return true;
    }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2019-02-27 23:54
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题