会员登录 用户名: 密码: 登录 新会员注册 [找回密码]
当前位置:编程论坛 >> C/S程序开发专区 >> VB编程论坛 >> 请教颜色填充问题
首页
中资源
  发表一个新主题  发表一个新投票  回复主题 您是本帖的第 339 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
 * 贴子主题:请教颜色填充问题 悬赏分200 [已结帖] 报告本帖给版主  显示可打印的版本  把本贴打包邮递  把本贴加入论坛收藏夹  发送本页面给朋友  把本贴加入IE收藏夹 
 zztxfxp 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:21
  专家分:0
  提问帖:1/1
  回答帖:1
  总帖数:5
  经验值:63
  注 册:2008-9-23
给zztxfxp发送一个短消息 把zztxfxp加入好友 查看zztxfxp的个人资料 搜索zztxfxp在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子楼主

发贴心情 请教颜色填充问题

请教各位大侠:我在picturebox里画两条测井曲线,即从上到下的两条相交曲线。现在我想将曲线相交的上下两部分构成的区域各用一种颜色填充,请问怎么实现。能大概说一下思路吗。万分感谢!!!!

这里列举了3条曲线数据,画出来就是随深度变化的3条垂向曲线。
DEPTH         USS          UCS          IAF       
2823.63       12.29       227.43       40.35 
2823.75       12.43       234.06       40.45 
2823.88       12.14       232.02       40.25 
2824.00       11.79       224.51       40.01 
2824.13       11.40       214.96       39.75 
2824.25       11.03       205.04       39.48 
2824.38       10.39       187.37       39.01 
2824.50       10.11       180.19       38.80 
2824.63       9.85       174.06       38.59  
2824.75       9.58       168.43       38.38  
2824.88       9.02       158.42       37.91  
2825.00       8.75       154.82       37.68  
2825.13       8.47       151.48       37.43  
2825.25       8.13       147.49       37.12  
2825.38       7.41       139.23       36.44  
2825.50       7.09       135.57       36.12  
2825.63       6.85       132.93       35.86  
2825.75       6.73       132.33       35.74  
2825.88       6.89       137.61       35.91  
2826.00       7.13       142.61       36.15  
2826.13       7.43       148.64       36.46  
2826.25       7.79       155.22       36.80  
2826.38       8.54       169.48       37.49  
2826.50       8.94       177.43       37.84  
2826.63       9.34       185.93       38.18  
2826.75       9.72       194.83       38.49  
2826.88       10.30       208.58       38.94 
2827.00       10.46       212.16       39.06 
2827.13       10.54       213.52       39.12 
2827.25       10.53       212.27       39.12 
2827.38       10.43       208.94       39.04 
2827.50       10.39       208.68       39.01 
2827.63       10.34       208.45       38.97 
2827.75       10.28       207.88       38.93 
2827.88       10.24       208.36       38.89 
2828.00       10.22       207.77       38.88 
2828.13       10.19       206.68       38.86 
2828.25       10.16       205.74       38.83 
2828.38       10.04       204.08       38.74 
2828.50       9.92       202.52       38.64  
2828.63       9.78       200.88       38.53  
2828.75       9.63       199.28       38.42  
2828.88       9.36       195.04       38.19  
2829.00       9.28       193.24       38.13  
2829.13       9.26       192.27       38.11  
2829.25       9.29       191.95       38.13  
2829.38       9.57       196.23       38.37  
2829.50       9.85       201.75       38.59  

要求是这种填充效果(见图片)按此在新窗口浏览图片
图中只列举一条曲线(黑色曲线),两边为填充的不同图案(这些图案可以选择,且列举在下方了了)。

[此贴子已经被作者于2008-11-22 10:55:34编辑过]
发帖:2008-11-20 22:34:00
  鲜花(0)  鸡蛋(0)
 delphi 帅哥哟,离线,有人找我吗?
  
  
  等 级:版主
  积 分:16411
  专家分:12023
  提问帖:2/2
  回答帖:774
  总帖数:1596
  经验值:1836
  注 册:2005-12-16
给delphi发送一个短消息 把delphi加入好友 查看delphi的个人资料 搜索delphi在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子2

发贴心情 

网上很我都是用这个代码来填充未知的封闭区域,但是我试用时,为什么不能用呢?誰能帮我看看   
    
    
  三、   算法的基本思想     
  本算法采用两个队列(FIFO)filled和unfilled来实现区域填充。设计步骤如下:     
  1.   找出该区域内部任意一点,作为填充种子。     
  2.   填充该点,并把该点存入队列filled。     
  3.   按逆时针,判断该点的上、右、下、左邻像素是否在filled队列内。如果在filled,说明该相邻点已填充,若不在filled队列内,则判断该相邻点在未填充队列unfilled,如果不在则将该相邻点存入unfilled。     
  4.   判断未填充队列是否为空,若不空,则从队列unfilled中取出头元素,转向第三步。若为空则表示已完成所有像素填充,结束程序。     
  四、   程序实现及说明     
  本算法定义的队列突破了递归算法中受堆栈空间大小的限制的束缚,因为它直接占用内存空间,与堆栈大小无关。以下源程序在Window   2000环境下用VB6.0编程实现。     
  建立如图所示标准窗体并画上控件-2个CommandButton控件和一个PictureBox控件,调整大小,并设置控件的属性。     
  4.1   通用声明     
  Dim   Xx   As   Integer,   Yy   As   Integer     
  Dim   Array1(9000,   2),   Array2(9000,   2)   As   Integer     
  4.2   采集     
  Private   Sub   Command1_Click()     
  Picture1.MousePointer   =   2     
  End   Sub     
  4.3   选取种子     
  Private   Sub   Picture1_MouseDown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)     
  Xx   =   X   '选择并记录种子点的位置     
  Yy   =   Y     
  End   Sub     
  4.4   区域填充     
  Private   Sub   Command2_Click()     
  Dim   i,   j,   k   As   Integer,   BoundPoint1,   BoundPoint2   As   Integer     
  Dim   Flag   As   Boolean,   Pixel   As   Long     
  Dim   Red,   Green,   Blue   As   Integer,   Bound   As   Boolean     
  Flag   =   True   '初始化     
  i   =   Xx:   j   =   Yy:   BoundPoint1   =   1     
  Array1(1,   1)   =   i     
  Array1(1,   2)   =   j     
  '搜索边界点     
  Do   While   BoundPoint1   >   0     
  BoundPoint2   =   0     
  For   k   =   1   To   BoundPoint1     
  i   =   Array1(k,   1)     
  j   =   Array1(k,   2)     
  '搜索右点     
  Pixel&   =   Picture1.Point(i,   j   +   1)     
  Call   IsBound(Pixel&,   Bound)     
  If   Not   Bound   Then     
  BoundPoint2   =   BoundPoint2   +   1     
  Array2(BoundPoint2,   1)   =   i     
  Array2(BoundPoint2,   2)   =   j   +   1     
  Picture1.PSet   (i,   j   +   1),   RGB(255,   255,   255)     
  End   If     
  '搜索左邻点     
  Pixel&   =   Picture1.Point(i,   j   -   1)     
  Call   IsBound(Pixel&,   Bound)     
  If   Not   Bound   Then     
  BoundPoint2   =   BoundPoint2   +   1     
  Array2(BoundPoint2,   1)   =   i     
  Array2(BoundPoint2,   2)   =   j   -   1     
  Picture1.PSet   (i,   j   -   1),   RGB(255,   255,   255)     
  End   If     
  '搜索上邻点     
  Pixel&   =   Picture1.Point(i   -   1,   j)     
  Call   IsBound(Pixel&,   Bound)     
  If   Not   Bound   Then     
  BoundPoint2   =   BoundPoint2   +   1     
  Array2(BoundPoint2,   1)   =   i   -   1     
  Array2(BoundPoint2,   2)   =   j     
  Picture1.PSet   (i   -   1,   j),   RGB(255,   255,   255)     
  End   If     
  '搜索下邻点     
  Pixel&   =   Picture1.Point(i   +   1,   j)     
  Call   IsBound(Pixel&,   Bound)     
  If   Not   Bound   Then     
  BoundPoint2   =   BoundPoint2   +   1     
  Array2(BoundPoint2,   1)   =   i   +   1     
  Array2(BoundPoint2,   2)   =   j     
  Picture1.PSet   (i   +   1,   j),   RGB(255,   255,   255)     
  End   If     
  Next   k     
  '数组array2   中的数据传给array1     
  BoundPoint1   =   BoundPoint2     
  For   k   =   1   To   BoundPoint1     
  Array1(k,   1)   =   Array2(k,   1)     
  Array1(k,   2)   =   Array2(k,   2)     
  Next   k     
  Picture1.Refresh     
  Loop     
  End   Sub     
  Public   Sub   IsBound(P   As   Long,   Bound   As   Boolean)   '判断P是否为边界点     
  Red   =   P&   Mod   256     
  Bound   =   False     
  Green   =   ((P&   And   &HFF00)   /   256&)   Mod   256&     
  Blue   =   (P&   And   &HFF0000)   /   65536     
  If   Red   =   255   And   Green   =   255   And   Blue   =   255   Then     
  Bound   =   True     
  End   If     
  End   Sub
发帖:2008-11-21 7:03:00
 pheonix99 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:9962
  专家分:95
  提问帖:0/0
  回答帖:117
  总帖数:65
  经验值:154
  注 册:2007-12-2
给pheonix99发送一个短消息 把pheonix99加入好友 查看pheonix99的个人资料 搜索pheonix99在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子3

发贴心情 

转一篇
本人不是很了解
不过能够填充

Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
'判断函数调用时指定虚拟键的状态
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Sub Form_Load()
Timer1.Interval = 1
End Sub

Private Sub Timer1_Timer()
Dim hdc As Long
Dim A As POINTAPI
Dim quyanse As Long
Call GetCursorPos(A) '取得鼠标位置
Text1.Text = "X坐标:" & A.x & "...Y坐标:" & A.y
hdc = GetDC(0) '0--取得整个屏幕的hDC  1-------
Picture1.BackColor = GetPixel(hdc, A.x, A.y) '取颜色
ReleaseDC 0, hdc '释放hDC
If MyHotKey(vbKeyF2) Then '如果按下F2,就获取颜色值到变量中
quyanse = GetPixel(Me.hdc, 2, 2) '取颜色值
Text2.Text = Str(quyanse)
MsgBox Text1.Text & "颜色值:" & quyanse
End If
End Sub
Private Function MyHotKey(vKeyCode) As Boolean
MyHotKey = (GetAsyncKeyState(vKeyCode) < 0)
End Function


按此在新窗口浏览图片

发帖:2008-11-21 10:46:00
 苦寒 帅哥哟,离线,有人找我吗?
  
  
  等 级:论坛游侠
  积 分:3219
  专家分:1819
  提问帖:0/0
  回答帖:198
  总帖数:215
  经验值:347
  注 册:2008-4-25
给苦寒发送一个短消息 把苦寒加入好友 查看苦寒的个人资料 搜索苦寒在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子4

发贴心情 

你的曲线数据是如何取的,贴个图上来!
思路是,你在绘制曲线的时候实际是用的短线段构成,每次绘制的时候实际产生一个小的区域,直接用指定的颜色填充就可以了.

一生一死一悲欢
一冬一夏一苦寒

发帖:2008-11-21 21:54:00
 zztxfxp 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:21
  专家分:0
  提问帖:1/1
  回答帖:1
  总帖数:5
  经验值:63
  注 册:2008-9-23
给zztxfxp发送一个短消息 把zztxfxp加入好友 查看zztxfxp的个人资料 搜索zztxfxp在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子5

发贴心情 请教颜色填充问题

5楼这个回复重复了哈,请求版主把这个回复删了哈,1到4楼都保留。谢谢
[此贴子已经被作者于2008-11-22 10:59:55编辑过]
发帖:2008-11-22 10:26:00
 苦寒 帅哥哟,离线,有人找我吗?
  
  
  等 级:论坛游侠
  积 分:3219
  专家分:1819
  提问帖:0/0
  回答帖:198
  总帖数:215
  经验值:347
  注 册:2008-4-25
给苦寒发送一个短消息 把苦寒加入好友 查看苦寒的个人资料 搜索苦寒在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子6

发贴心情 

Private Type POINTAPI
       x As Long
       y As Long
    End Type
    Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As Any, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
    Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As Any, ByVal nCount As Long) As Long
    Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
    Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Const ALTERNATE = 1
    Private Const WINDING = 2
    Private Const BLACKBRUSH = 4

Private Sub Command1_Click()
     ' 定义顶点坐标数组
     ReDim poly(1 To 4) As POINTAPI
     NumCoords = 4
     ' 设置scalemode属性为pixels(像素)
     p.ScaleMode = 0
     poly(1).x = 12.29
     poly(1).y = 23.63
     
     poly(2).x = 27.43
     poly(2).y = 23.63
     
     poly(3).x = 34.06
     poly(3).y = 30.75
     
     poly(4).x = 12.43
     poly(4).y = 30.75

     ' Polygon函数创建未填充的多边形
     ' 如果注释掉下面FillRgn那行,就可以看到不填充的多边形
     bool = Polygon(p.hdc, poly(1), NumCoords)
     ' 获得黑色画刷
     hBrush = GetStockObject(BLACKBRUSH)
     ' 为了填充颜色创建区域
     hRgn = CreatePolygonRgn(poly(1), NumCoords, ALTERNATE)
     ' 通过创建成功就使用颜色填充
     If hRgn Then bool = FillRgn(p.hdc, hRgn, hBrush)
     DeleteObject (hRgn)

End Sub

我这里给你一段代码,p是picturebox,这里只是一个区域的填充,4个顶点.你画曲线的时候将4个点的坐标填进去就可以了.颜色这里采用的是黑色,如果你用其他颜色,只需要修改画刷颜色即可!


一生一死一悲欢
一冬一夏一苦寒

发帖:2008-11-22 12:10:00
 zztxfxp 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:21
  专家分:0
  提问帖:1/1
  回答帖:1
  总帖数:5
  经验值:63
  注 册:2008-9-23
给zztxfxp发送一个短消息 把zztxfxp加入好友 查看zztxfxp的个人资料 搜索zztxfxp在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子7

发贴心情 谢谢

非常感谢您。我下去再试试。以后再向您请教哈
发帖:2008-11-22 15:26:00
 zztxfxp 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:21
  专家分:0
  提问帖:1/1
  回答帖:1
  总帖数:5
  经验值:63
  注 册:2008-9-23
给zztxfxp发送一个短消息 把zztxfxp加入好友 查看zztxfxp的个人资料 搜索zztxfxp在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子8

发贴心情 用图片填充呢

谢谢‘苦寒’的赐教。不过还有一点请教:我不用颜色填充,若用我自己的图片填充呢
发帖:2008-11-23 11:05:00
 苦寒 帅哥哟,离线,有人找我吗?
  
  
  等 级:论坛游侠
  积 分:3219
  专家分:1819
  提问帖:0/0
  回答帖:198
  总帖数:215
  经验值:347
  注 册:2008-4-25
给苦寒发送一个短消息 把苦寒加入好友 查看苦寒的个人资料 搜索苦寒在VB编程论坛的所有贴子 引用回复这个贴子 回复这个贴子9

发贴心情 

用图片填充,也需要一块一块的绘制,同样使用API函数来实现.网络上搜索一下,不行,在开贴发问!

一生一死一悲欢
一冬一夏一苦寒

发帖:2008-11-23 20:45:00

本主题贴数9,分页:[返回帖子列表] [上一页] [1] [下一页]

此主题已经结帖:

pheonix99-20,苦寒-160,delphi-20

 *快速回复:请教颜色填充问题  [ 回帖是一种美德 :) ]
会员账号 用户名    还没注册?    密码    忘记密码?
内容
  • HTML标签: 不可用
  • UBB标签: 可用
  • 贴图标签: 可用
  • 多媒体标签:可用
  • 表情字符转换:可用
  • 上传图片:不可用
  • 最多15KB
  • 点击表情图即可在帖子中加入相应的表情
                                
    邮件回复 显示签名   [Ctrl+Enter直接提交贴子]

    管理选项锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告