绘制摆线曲线
Draw a curve of the Cycloid
一天中的好时光。需要绘制摆线图,半径由用户指定。设法只画了一半的时期,我不明白那是什么。
代码正在应用。
我的函数:
return r * Math.Acos((r - y) / r) - Math.Sqrt(2 * r * y - Math.Pow(y, 2));
我的主要部分:
GraphPane pane = zedGraph.GraphPane;
pane.CurveList.Clear();
PointPairList list = new PointPairList();
double r = 20;
double xmax = 50;
for (double y = 0; y < xmax; y+=0.5)
{
list.Add(CountIt(y, r), y);
}
LineItem myCurve = pane.AddCurve("Cycloid", list, Color.Red, SymbolType.None);
zedGraph.AxisChange();
zedGraph.Invalidate();
看来是要考虑y>2r的情况,或者说应该有几种可能的x?我不知道如何摆脱困境。
使用参数方程更简单(t=0..2*Pi
一个周期):
x = r * (t - sin(t))
y = r * (1 - cos(t))
如果您想继续使用笛卡尔方程 x(y) - 更改 y
的限制以更正值 2 * r
并像这样镜像第二部分:
for (double y = 0; y < 2 * r; y+=0.5)
{
list.Add(CountIt(y, r), y);
}
for (double y = 2 * r; y >= 0; y-=0.5)
{
list.Add(2 * Pi * r - CountIt(y, r), y);
}
如果需要画几个句点,限制xmax:
p = 0;
while true do
{
for (double y = 0; y < 2 * r; y+=0.5)
{ x = 2 * Pi * r * p + CountIt(y, r);
if (x > xmax)
break;
list.Add(x, y);
}
for (double y = 2 * r; y >= 0; y-=0.5)
{
x = 2 * Pi * r * (p + 1) - CountIt(y, r);
if (x > xmax)
break;
list.Add(x, y);
}
p++;
}
一天中的好时光。需要绘制摆线图,半径由用户指定。设法只画了一半的时期,我不明白那是什么。
代码正在应用。
我的函数:
return r * Math.Acos((r - y) / r) - Math.Sqrt(2 * r * y - Math.Pow(y, 2));
我的主要部分:
GraphPane pane = zedGraph.GraphPane;
pane.CurveList.Clear();
PointPairList list = new PointPairList();
double r = 20;
double xmax = 50;
for (double y = 0; y < xmax; y+=0.5)
{
list.Add(CountIt(y, r), y);
}
LineItem myCurve = pane.AddCurve("Cycloid", list, Color.Red, SymbolType.None);
zedGraph.AxisChange();
zedGraph.Invalidate();
看来是要考虑y>2r的情况,或者说应该有几种可能的x?我不知道如何摆脱困境。
使用参数方程更简单(t=0..2*Pi
一个周期):
x = r * (t - sin(t))
y = r * (1 - cos(t))
如果您想继续使用笛卡尔方程 x(y) - 更改 y
的限制以更正值 2 * r
并像这样镜像第二部分:
for (double y = 0; y < 2 * r; y+=0.5)
{
list.Add(CountIt(y, r), y);
}
for (double y = 2 * r; y >= 0; y-=0.5)
{
list.Add(2 * Pi * r - CountIt(y, r), y);
}
如果需要画几个句点,限制xmax:
p = 0;
while true do
{
for (double y = 0; y < 2 * r; y+=0.5)
{ x = 2 * Pi * r * p + CountIt(y, r);
if (x > xmax)
break;
list.Add(x, y);
}
for (double y = 2 * r; y >= 0; y-=0.5)
{
x = 2 * Pi * r * (p + 1) - CountIt(y, r);
if (x > xmax)
break;
list.Add(x, y);
}
p++;
}