Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Посторение графика функции y=[ax]


Автор: Ronnie 24.12.2009, 18:42
Всем привет.
Нужно написать программу, строящую график функции y=[ax] ( [ ] - целая часть ).
Прикрепил картинку, как получается у меня, и как примерно должен выглядеть график.
Т.е., как вы поняли, нужно убрать вертикальные части графика. Помогите, пожалуйста, исправить ошибку.

Исходный:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            Pen pn = new Pen(Color.Black);
            Pen p = new Pen(Color.LightBlue);
            
            for (int i = 3; i <= 46; i += 4)
            {
                g.DrawLine(p, i * 5, 0, i * 5, 230);
                g.DrawLine(p, 0, i * 5, 230, i * 5);
                g.DrawLine(pn, i * 5, 118, i * 5, 112);
                g.DrawLine(pn, 112, i * 5, 118, i * 5);
            }
            g.DrawLine(pn, 115, 0, 115, 230);
            g.DrawLine(pn, 0, 115, 230, 115);
            g.DrawLine(pn, 115, 0, 120, 10);
            g.DrawLine(pn, 115, 0, 110, 10);
            g.DrawLine(pn, 230, 115, 220, 120);
            g.DrawLine(pn, 230, 115, 220, 110);
            Font h = new Font("Arial", 10, FontStyle.Regular);
            g.DrawString("y", h, Brushes.Black, 120, 3);
            g.DrawString("x", h, Brushes.Black, 210, 92);
            double a;
            try
            {
                a = float.Parse(textBox1.Text);
            }
            catch
            {
                a = 1;
            }

            Point[] points = new Point[2300];
            int j = 0;

            
            for (double i = 0; i < points.Length; i += 0.1)
            {
                double y = -20 * Math.Floor(a * (i - 115) / 20) + 115;
                if ((int)y==y)
                {
                    if (j < 2300)
                    {
                        points[j] = new Point((int)i, (int)y);
                        j++;
                    }
                }
            }


            g.DrawLines(pn, points);
        }



        private void Key_press1(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar) && !(char.IsControl(e.KeyChar)))
                if (!((e.KeyChar.ToString() == ",") && (textBox1.Text.IndexOf(",") == -1)))
                    if (!((e.KeyChar.ToString() == "-") && (textBox1.Text.IndexOf("-") == -1)))
                    {
                        e.Handled = true;
                    }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Refresh();
        }
    }
}


Автор: serbelyakov 24.12.2009, 20:35
Я тоже так строл графики, используя событие - Paint. Но зачем так мучаться, если есть Microsoft Chart Controls? Если лень или нет времени разбираться смотри - http://www.virtualexpert.ru/chart.htm

Автор: Ronnie 25.12.2009, 18:02
мне нужно именно вручную нарисовать, без дополнительных компонентов

Автор: Ronnie 26.12.2009, 10:52
спасибо, уже разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)