Отрисовка циклоиды на ZedGraph/Chart

257
23 марта 2018, 09:54

Всем доброго времени суток. Встал перед вопросом, есть простенькая формула выражающая координату Х графика кривой Циклоида. (от нас требуется только задать радиус??https://ru.wikipedia.org/wiki/Циклоида)

return r* Math.Acos((r - y) / r) - Math.Sqrt(2*r*y - Math.Pow(y,2));

Рисую так:

for (double y = ymin; y <= ymax; y += 1)
{
 list.Add(CountIt(y, r),y);
}

Кривая просто рисуется постепенно уходящей куда-то вверх, я подумал, что возможно я никак не учел период, либо то, что Acos возвращает значение в радианах? Поэксперементировал, но ничего не вышло.

Answer 1

Мне кажется, вы что-то где то попутали с периодами. У меня после мытарств получилось следующее

private void DrawPlotDek()
{       
    float r = 100;
    float ymin = 0;
    float ymax = r*8;
    for (var y = ymin; y < ymax; y += 0.01f)
    {           
        var x = r* Math.Acos((r - y) / r) - Math.Sqrt(2*r*y - Math.Pow(y,2));
        SetPixel((float)x, (float)y);
        SetPixel((float)(x + 2 * Math.PI * r), (float)y);
        x = r * (Math.PI / 2 - Math.Acos((r - y) / r)) + Math.Sqrt(2 * r * y - Math.Pow(y, 2)) + r * 3/2 * Math.PI;
        SetPixel((float)x, (float)y);           
    }
}

Как оно получилось - эксперименты и осколки воспоминаний из тригонометрии.

Результат:

Имхо, гораздо понятней считать по параметрическим координатам.

private void DrawPlot()
{
    float tmin = 0;
    float tmax = 100;
    float r = 100;
    for(var t=tmin; t<tmax; t+=0.0001f)
    {
        var x = r*t - r*Math.Sin(t);
        var y = r - r*Math.Cos(t);
        SetPixel((float)x, (float)y);
    }
}

Результат:

Если наложить их друг на друга

Полный код

void Main()
{
    var f = new MyForm();
    f.Show();
    f.Draw();
}
class MyForm : Form
{
    private Graphics _g;
    private Brush _b;
    public MyForm()
    {
        this.Height = 500;
        this.Width = 950;
        this.StartPosition = FormStartPosition.CenterScreen;
        Draw();
    }
    public void Draw()
    {
        _g = this.CreateGraphics();
        DrawAxes();             
        _b = Brushes.Red;       
        DrawPlot();     
        _b = Brushes.Green;
        DrawPlotDek();
    }   
    private void DrawPlot()
    {
        float tmin = 0;
        float tmax = 100;
        float r = 100;
        for(var t=tmin; t<tmax; t+=0.0001f)
        {
            var x = r*t - r*Math.Sin(t);
            var y = r - r*Math.Cos(t);
            SetPixel((float)x, (float)y);
        }
    }
    private void DrawPlotDek()
    {       
        float r = 100;
        float ymin = 0;
        float ymax = r*8;
        for (var y = ymin; y < ymax; y += 0.01f)
        {           
            var x = r* Math.Acos((r - y) / r) - Math.Sqrt(2*r*y - Math.Pow(y,2));
            SetPixel((float)x, (float)y);
            SetPixel((float)(x + 2 * Math.PI * r), (float)y);
            x = r * (Math.PI / 2 - Math.Acos((r - y) / r)) + Math.Sqrt(2 * r * y - Math.Pow(y, 2)) + r * 3/2 * Math.PI;
            SetPixel((float)x, (float)y);           
        }
    }
    public void DrawAxes()
    {
        _g.DrawLine(Pens.Blue, 25, 400, 700, 400);
        _g.DrawLine(Pens.Blue, 50, 25, 50, 800);
    }
    private void SetPixel(float x, float y) 
    {
        y = - y + 400;
        x += 50;        
        _g.FillRectangle(_b, x, y, 1, 1);   
    }
}
READ ALSO
datagridview и tabcontrol winforms c#

datagridview и tabcontrol winforms c#

Есть таблица Rooms и tabcontrolВ таблице Rooms есть Id и Name=Кабинка 1, Кабинка 2 и

195
Получить путь до каталога выше

Получить путь до каталога выше

В папке Debug имеется папка "Updater", из нее запускается exe и загружает файлы в папку bin/Debug/Updater/temp/, нужно переместить файлы из папки temp в папку /bin/ Подскажите,...

232
Переписать элементы массива. C#

Переписать элементы массива. C#

Ребят, подскажите, почему при добавлении элемента в методе InsertElement() индекс выходит за границы?

205
Как лучше хранить элементы

Как лучше хранить элементы

Дано около 6000 5-ти значных чисел их нужно между собой умножать и сравниватьЧто лучше использовать для хранения массив,лист,или строку? Точное...

241