Всем доброго времени суток. Встал перед вопросом, есть простенькая формула выражающая координату Х графика кривой Циклоида. (от нас требуется только задать радиус??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
возвращает значение в радианах? Поэксперементировал, но ничего не вышло.
Мне кажется, вы что-то где то попутали с периодами. У меня после мытарств получилось следующее
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);
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть таблица Rooms и tabcontrolВ таблице Rooms есть Id и Name=Кабинка 1, Кабинка 2 и
В папке Debug имеется папка "Updater", из нее запускается exe и загружает файлы в папку bin/Debug/Updater/temp/, нужно переместить файлы из папки temp в папку /bin/ Подскажите,...
Ребят, подскажите, почему при добавлении элемента в методе InsertElement() индекс выходит за границы?
Дано около 6000 5-ти значных чисел их нужно между собой умножать и сравниватьЧто лучше использовать для хранения массив,лист,или строку? Точное...