关于图象生成问题,谢谢解答(有图片)(20分)

  • 主题发起人 主题发起人 crossbannyli
  • 开始时间 开始时间
C

crossbannyli

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我的毕业设计的部分内容。给定已知点,生成曲线、闭合曲线图形,谢谢帮忙

http://www.efile.com.cn/efile/banny/homepage/kk.jpg


http://www.efile.com.cn/efile/banny/homepage/bb.jpg
 
不懂什么意思?请说明意图。
如果是还不知道怎么做,就说请讲讲思路,
如果是里面某个部分有难度,那么也请描述好问题
 
知道N个点的坐标,然后生成曲线

例如x1(100,105)
x2(110,120)
x3(130,180)
x4(150,90)
x5(170,60)
x6(190,110)
.
.
.
连接成曲线啊,不知道怎么做
没要求,只要能实现就是了
 
我也有点不太清楚,但是如果不理会数学模型本来的样子
可能可以使用PolyBezierTo,PolyBezier函数来进行
俺这里也没有DELPHI,没办法给你试
 
下面是刚VB写的一个例子,使用了刚才的函数
但是对于学校而言,这种平滑曲线应该是有特定含义的,尤其是实验数据,
所以这个程序对你估计没多少作用,但是只要你做相应的设置,可能还是能参考一下的

做法:新建一程序,在画面上加一个PICTUREBOX,一个按钮
复制下面的代码


Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function PolyBezier Lib "gdi32" (ByVal hdc As Long, lppt As POINTAPI, ByVal cPoints As Long) As Long






Private Sub Command1_Click()

Const Speed As Single = 1
'描绘的点数,我这段程序因为采用的循环的关系,请使用3*n +1
Const PointNum As Long = 31 '3*10+1

'要描绘的点阵
Dim Points(PointNum - 1) As POINTAPI
'当然是XY的坐标了
Dim x(PointNum - 1) As Single
Dim y(PointNum - 1) As Single
'这是变化的点数
Dim DX(PointNum - 1) As Single
Dim DY(PointNum - 1) As Single
'循环用变数
Dim I As Long
Dim J As Long
'我这里用随机数产生所有点数
For I = 0 To PointNum - 1
x(I) = I * 20
y(I) = 2 * I + Rnd * 50
DX(I) = Rnd * Speed - Speed / 2
DY(I) = Rnd * Speed - Speed / 2
Next
'这是函数要求的hdc容器
Picture1.AutoRedraw = True

For I = 0 To PointNum - 1
If x(I) + DX(I) < 0 Or x(I) + DX(I) > 200 Then DX(I) = -DX(I)
If y(I) + DY(I) < 0 Or y(I) + DY(I) > 200 Then DY(I) = -DY(I)
x(I) = x(I) + DX(I)
y(I) = y(I) + DY(I)
Points(I).x = x(I)
Points(I).y = y(I)
Next

'想画得好点,去掉下面的注释看看
' For I = 3 To PointNum - 2 Step 3
' Points(I).x = (x(I - 1) + x(I + 1)) / 2
' Points(I).y = (y(I - 1) + y(I + 1)) / 2
' Next
'清空原有内容
Picture1.Cls
'开始描绘
PolyBezier Picture1.hdc, Points(0), PointNum

DoEvents


End Sub

 
procedure TForm1.Button1Click(Sender: TObject);
var P:Array[0..6] of TPoint;
begin
P[0]:=Point(100,105);
P[1]:=Point(110,120);
P[2]:=Point(130,180);
P[3]:=Point(150,90);
P[4]:=Point(170,60);
P[5]:=Point(190,110);
P[6]:=Point(100,105);
Self.Canvas.MoveTo(100,105);
Self.Canvas.PolyBezier(P);
end;
 
用TChart
比如
数据为
x[0],y[0],x[1],y[1],...,x[99],y[99],

BCB:
for(int k = 0;k < 100;k++)
Chart1->Series[0]->AddXY(x[k],y[k],"",clTeeColor);

Delphi:
for k := 0 to 99 do
Chart1.Series[0].AddXY(x[k],y[k],'',clTeeColor);

你可以在Form上放置Chart1,先设置好Series。
如果想把图形拷贝到粘贴板,可以
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Chart1->CopyToClipboardMetafile( true );
} 
 
TYZhang兄的方法比较好理解
请大家解释下Self.Canvas.MoveTo(100,105);
Self.Canvas.PolyBezier(P)的意思
PolyBezier()函数,我只要实现曲线就是了

Chart1的方法能实现曲线闭合吗?谢谢解答

第一次要处理实验数据,呵呵,我试看下……
 
可以实现,谢谢解答[:D]
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
872
DelphiTeacher的专栏
D
后退
顶部