×

图 算法 算法

农夫过河的图算法?如何用粒度分析资料通过图算法以福克和沃德的公式求各粒度参数

admin admin 发表于2023-09-27 17:36:33 浏览39 评论0

抢沙发发表评论

本文目录

农夫过河的图算法

#include《iostream》using namespace std;#define VertexNum 16 //最大顶点数 typedef struct // 图的顶点 { int farmer; // 农夫 int wolf; // 狼 int sheep; // 羊 int veget; // 白菜}Vertex; typedef struct { int vertexNum; // 图的当前顶点数 Vertex vertex) // 有结果 { printPath(&graph, start, end); return 0; } return -1; }

如何用粒度分析资料通过图算法以福克和沃德的公式求各粒度参数

9. 图算法我不知道是啥,可以从软件直接输出含量为5%,25%等等的值,再用公式Φ=-log2 d,把输出的um转换成Φ,在套入各个参数公式就行了。10C-M图是应用每个样品的C值和M 值绘成的图形。C是粒度分析资料累积曲线上颗粒含量1%处对应的粒径,M值是累积曲线上 50 % 处对应的粒径,即粒度中值。C值与样品中最粗颗粒的粒径相当,代表了水动力搅动开始搬运的最大能量; M值是中值,代表了水动力的平均能量。 对于每一个样品都可以用其C值和M值,在以C值(um)为纵坐标、以 M 值(um)为横坐标的双对数坐标纸(当CM单位为ф时则用线性坐标就行)上投得一个点。 C-M图是帕塞加 (Passega,1957,1964) 提出的。帕塞加将搬运沉积物的底流分为以下两种形式: 牵引流:河流、海(湖) 流、触及海 (湖) 底的波浪都属于牵引流,它以滚动或悬浮两种方式搬运沉积物。在悬浮搬运中还包括递变悬浮、均匀悬浮和远洋悬浮。 浊流:这是一种流速很快的高密度流,它主要以悬浮方式搬运沉积物。由于有大量泥、砂,甚至卵石悬浮其中,故水流十分混浊。 浊流沉积与牵引流沉积在C-M 图上有较明显的区别。在C-M图中,将C,M 点连成一条线,构成C=M基线。浊流沉积的图形以平行于C=M基线为特征;而牵引流沉积的图形则只有较短的一部分平行C=M基线,或者完全不与 C = M 基线平行。 (1) 牵引流沉积的 C-M 图在 C-M 图中,牵引流沉积的典型图形可划分为 N—O—P-Q—R—S 各段,1 表示牵引流沉积,2 表示浊流沉积,3 表示静水悬浮沉积。Ⅰ,Ⅱ,Ⅲ,Ⅸ段表示 C 》 1000μm,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ段表示 C 《 1000μm 。 帕塞加(Passega)牵引流沉积C-M模式图 1) QR 段代表递变悬浮沉积。递变悬浮搬运是指在流体中悬浮物质由下向上粒度逐渐变细,密度逐渐变低。它一般位于水流底部,常是由于涡流发育造成的。当涡流流速降低时,迅速发生滚动。递变悬浮沉积物的一个最大特点是C与M成比例地增加,即C值与M值相应变化,从而使这段图形与C=M基线平行。 在牵引流沉积中,C值常指示最大的地质营力。QR段C的最大值以Cs表示,一般认为Cs是代表底部的最大搅动指数。而这段的最小值Cu则代表底部的最小搅动指数。 2) RS 段为均匀悬浮,是粒径和密度不随深度变化的完全悬浮。均匀悬浮常是递变悬浮之上的上层水流搬运方式。在弱水流中可能不存在递变悬浮,而是由均匀悬浮直接与底床接触。均匀悬浮的物质主要为粉砂和泥质的混合物,最粗粒度为细砂。由于均匀悬浮搬运常不受底流分选,在河流中从上游至下游沉积物的粒度成分变化不大,只是粗粒级含量相对减少。因此在RS段中C值往往基本不变,而M值向S 端减小。RS段的最大C值即Cu,它代表均匀悬浮搬运的最大粒级。 3) PQ段仍以悬浮搬运为主,但含有少量滚动搬运组分。由上游至下游C值变化而 M值不变,说明随着地质营力的减弱,越向下游滚动组分的颗粒越小。但由于滚动颗粒的数量并不多,因此 M 值基本不变。PQ 段 P 点附近的 C 值以 Cr 表示,它代表着最易作滚动搬运的颗粒直径。 4) OP 段以滚动搬运为主,滚动组分与悬浮组分相混合。C值一般大于 800μm,但由于滚动组分中有悬浮物质的参加,从而使 M 值有明显的变化。 5) NO 段基本上由滚动颗粒组成,C值一般大于1mm(1000μm),常构成河流的砂坝砾石堆积物。具体到某一地层成因单位来看,其 C-M 图常常不是包含上述所有的段,而是只有少数几个段,各段的位置和大小亦不尽相同。如能抓住这些特点并结合沉积构造序列分析,将其与典型的 C-M 图形进行对比,便可作出沉积成因解释。除河流沉积外,还有一些其他类型的牵引流沉积。 在海滩地带,由于环境动荡,细的悬浮物质不沉降,因此粗颗粒不能被埋藏,滚动颗粒可以搬运很长距离后再沉积,所以在海滩沉积物中滚动组分很多。海滩沉积物的C-M图表现为分散的图形,一般C》200μm,M》100μm,样品点在Ⅰ,Ⅱ,Ⅲ,Ⅳ区中散布。远洋区集中了最细的悬浮沉积物,其颗粒均十分细小,在C-M图上构成了3区。除深海外,深湖、泻湖、海湾、礁湖等静水盆地沉积也属于这一类型。(2) 浊流沉积的 C-M 图是很好的平行于C=M基线的图形。浊流的流速很快,当流速降低时,悬浮物质移向底部,使底部密度不断增加,最终形成整体的沉降作用,并形成未分选的沉积物。浊流沉积所特有的递变层理,正是递变悬浮和整体沉降作用的反映。 浊流为高密度流,沉积作用进行很快,颗粒沉积后随即被埋藏,因而组分中缺乏滚动颗粒。其结果是,在 C-M 图上浊流沉积物的 C 值与M 值密切相关变化,形成与 C =M 基线平行的图形。这一特点与牵引的递变悬浮沉积 (Q R段)相似。但 C值与M 值的变化幅度均较大,这一点却是浊流沉积 C-M 图的独有特征。如在浊流沉积 C-M图点群中画一条平均线,平均线与C=M基线的水平距离 Im能代表浊流沉积的分选性。Im值越小,说明沉积物的分选性越好。因为,在一般情况下 C 值与 M 值靠近是分选好的标志。这一道理在牵引流递变悬浮沉积物的分选性分析中亦适用。由于沉积物点群在 C-M 图上的位置取决于沉积物的搬运沉积方式,因此利用 C-M图可对碎屑物质的搬运沉积条件作出判断。另外,各沉积环境都有其特征的 C-M 图模式,所以用 C-M 图也能为沉积环境解释提供参考依据。

求教图算法缩点如何进行

有向图,每个节点带有权值 已经使用Tarjan算法求出强连通分量(包含若干个节点) 欲将强连通分量缩为两个点,一个节点拥有最大值,一个结点拥有最小值 连入该强连通分量的所有节点指向最小值的节点,强连通分量连出的节点都改为从最大值节点处连出 以此消去图中的环对于每一个强连通分量都遍历一遍图中所有节点,一一修改边貌似不太现实把

九宫图算法的算法实现

// 九宫图算法;//////////////////////////////////////#include《sio.h》#include《time.h》#include《slib.h》////////////////////////////////////// the function defination//////////////////////////////////void create(int );void show(int );void set_value(int );void aim_get(int );void target(int );void judge_x1(int );void judge_x2(int );void judge_x3(int );void judge_x4(int );void judge_x5(int );void shift_all(int );void shift_low_six(int );void anti_shift_all(int );void shift_low_four(int );void last_shift(int );void set_x5(int );///////////////////////////////////////////// the main function body ////////////////////////////////////////////main(){srand(time(NULL));int cDiagram;create(cDiagram); /////// creat the new array ,set the value are 10;set_value(cDiagram);//last_shift(cDiagram);return 0;}////////////////////////////////////////// 建立一个3*3数组,初值都设为10;////////////////////////////////////////void create(int array){printf(“\n\n***********************************\n\n“);printf(“九宫图算法实现过程\n\n“);printf(“***********************************\n\n“);int line;int row;for(line=0;line《3;line ){for(row=0;row《3;row ){array){judge=1;}}}if(judge==1){judge_x1(array);}else{target(array);}}//////////////////////////////////////////// the target diagram ///////////////////////////////////////////////void target(int array){printf(“\n\n the last diagram is :\n“);show(array);}///////////////////////////////////////judge the x1 is 1 or no! ///////////////////////////////////////////void judge_x1(int array){//int x1=1;int temp;//printf(“ \n\n\n the array=%d\n\n“,array);if(array!=1 && array!=0) // x3!=1 || x3!=0;{while(array!=1){//printf(“i am here!!1“);temp=array;array=array;array=array;array=array;array=array;array=array;array=array;array=array;array=temp;}}else{if(array==0) // x3==0;{// printf(“\n\n array=0\n\n“);temp=array;array=array;array=temp;judge_x1(array);goto tt;}else /// x3==1;{ //printf(“\n\narray should is 1, %d“,array);if(array==0) //// x0==0;{temp=array;array=array;array=temp;judge_x1(array);}else //// x3==1 && x0!=0;{shift_all(array);judge_x1(array);}}}printf(“ 确定了X1位置后,九宫图为:\n“);

图计算框架有哪些

图计算框架回顾 0 从数据并行到图并行 自从04 年 Google 公开了它的 MapReduce 之后,大家就像是发现了什么新大陆一样以极大的热情投入到新型计算框

程序员必须掌握哪些算法

一.基本算法:枚举. (poj1753,poj2965)贪心(poj1328,poj2109,poj2586)递归和分治法.递推.构造法.(poj3295)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:图的深度优先遍历和广度优先遍历.最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026)拓扑排序 (poj1094)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)最大流的增广路算法(KM算法). (poj1459,poj3436)三.数据结构.串 (poj1035,poj3080,poj1936)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)简单并查集的应用.哈希表和二分查找等高效查找法(数的Hash,串的Hash) (poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)哈夫曼树(poj3253)堆trie树(静态建树、动态建树) (poj2513)四.简单搜索深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)五.动态规划背包问题. (poj1837,poj1276)型如下表的简单DP(可参考lrj的书 page149):E}.(最优二分检索树问题)六.数学组合数学:1.加法原理和乘法原理.2.排列组合.3.递推关系.(POJ3252,poj1850,poj1019,poj1942)数论.1.素数与整除问题2.进制位.3.同余模运算.(poj2635, poj3292,poj1845,poj2115)计算方法.1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)七.计算几何学.几何公式.叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)(poj1408,poj1584)凸包. (poj2187,poj1113)中级(校赛压轴及省赛中等难度):一.基本算法:C++的标准模版库的应用. (poj3096,poj3007)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)二.图算法:差分约束系统的建立和求解. (poj1201,poj2983)最小费用最大流(poj2516,poj2516,poj2195)双连通分量(poj2942)强连通分支及其缩点.(poj2186)图的割边和割点(poj3352)最小割模型、网络流规约(poj3308)三.数据结构.线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)静态二叉检索树. (poj2482,poj2352)树状树组(poj1195,poj3321)RMQ. (poj3264,poj3368)并查集的高级应用. (poj1703,2492)KMP算法. (poj1961,poj2406)四.搜索最优化剪枝和可行性剪枝搜索的技巧和优化 (poj3411,poj1724)记忆化搜索(poj3373,poj1691)五.动态规划较为复杂的动态规划(如动态规划解特别的旅行商TSP问题等)(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)记录状态的动态规划. (POJ3254,poj2411,poj1185)树型动态规划(poj2057,poj1947,poj2486,poj3140)六.数学组合数学:1.容斥原理.2.抽屉原理.3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).4.递推关系和母函数.数学.1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)2.概率问题. (poj3071,poj3440)3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)计算方法.1.0/1分数规划. (poj2976)2.三分法求解单峰(单谷)的极值.3.矩阵法(poj3150,poj3422,poj3070)4.迭代逼近(poj3301)随机化算法(poj3318,poj2454)杂题(poj1870,poj3296,poj3286,poj1095)七.计算几何学.坐标离散化.扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用)(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)多边形的内核(半平面交)(poj3130,poj3335)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)高级(regional中等难度):一.基本算法要求: 代码快速写成,精简但不失风格 (poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)保证正确性和高效性. poj3434二.图算法:度限制最小生成树和第K最短路. (poj1639)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446最优比率生成树. (poj2728)最小树形图(poj3164)次小生成树.无向图、有向图的最小环 三.数据结构. trie图的建立和应用. (poj2778)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法(RMQ+dfs)).(poj1330)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的). (poj2823)左偏树(可合并堆). 后缀树(非常有用的数据结构,也是赛区考题的热点).(poj3415,poj3294)四.搜索 较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法. (poj3131,poj2870,poj2286)五.动态规划 需要用数据结构优化的动态规划.(poj2754,poj3378,poj3017)四边形不等式理论.较难的状态DP(poj3133)六.数学 组合数学.1.MoBius反演(poj2888,poj2154)2.偏序关系理论.博奕论.1.极大极小过程(poj3317,poj1085)2.Nim问题.七.计算几何学. 半平面求交(poj3384,poj2540)可视图的建立(poj2966)点集最小圆覆盖.对踵点(poj2079)

九宫图算法的实现步骤

第一步:菱形斜填写 第二步:菱形四角的3和7,1和9交换,如下图 第三步:9和1插队进去,如图先将1—9九个数按如下图排列14 b 27 c 5 a 38 d 69然后将a用7代替,同理1换d,3换c,9换b便可得如下排列:4 9 23 5 78 1 6此方法也可推导至所有的基数的平方宫图进行排列。方法2:以中下格为起点,按右下为方向顺序填写(想象格子上下相连,左右相连),遇到右下格已占,填入正上方格内。以25格为例: 11↘ 18↘ 25 2↘ 9↘10填左方 10↑11填上方 12↘ 19↘ 21↘ 3↘4填左方 4↘ 6↘ 13↘ 20↑ 11填上方 22↘23填左方 23↘ 5↑6填上方 7↘ 14↘ 16↘17填左方 17↘18填上方 24↘25填上方 1↘2填上方 8↘9填上方 15↑ 16填上方

镂空图算法的基本思想是什么

在开发界面及棋牌游戏过程中,需要很多镂空的图片,而且图片形式一般比较固定.所以封装了几种常见的镂空方法.1. 用于没有掩码图,只有指定透明色,不进行伸缩void DrawTransBitmap( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 COLORREF crTransparent // 透明色,COLORREF类型 );适用图片:2. 用于没有掩码图,只有指定透明色,可以进行伸缩void DrawTransBitmap( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 int nWidthSrc, // 源宽度 int nHeightSrc, // 源高度 COLORREF crTransparent // 透明色,COLORREF类型 );适用图片:同1,可拉伸3.指定掩码图,和掩码图属于不同图片 void DrawTransBitmap( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC HDC hdcMask, //掩码DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 COLORREF crTransparent // 透明色,COLORREF类型 );适用图片: 和 4.指定图片和掩码图同属于一张图片void DrawTransBitmap(HDC hDC, int nPosX, int nPosY, int nCX, int nCY, HBITMAP hObj );适用图片:5.得到位图HRGN HRGN CreateBitmapRgn(int nWidth,int nHeight,HBITMAP hbmp,COLORREF cTrans);适用图片:以下是完整代码//用于没有掩码图,只有指定透明色,不进行伸缩void CCommon::DrawTransBitmap( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 COLORREF crTransparent // 透明色,COLORREF类型 )......{ HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图 HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图 HDC hImageDC = CreateCompatibleDC(hdcDest);//临时DC HDC hMaskDC = CreateCompatibleDC(hdcDest);//临时掩码DC hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP); hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP); // 将源DC中的位图拷贝到临时DC中,源DC已经载入位图 BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY); // 设置临时DC的透明色 SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的临时掩码DC的掩码位图 // 位图来自临时DC BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图 SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色 SetBkColor(hdcDest,RGB(255,255,255)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // “或“运算,生成最终效果 BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); // 清理、恢复 SelectObject(hImageDC, hOldImageBMP); DeleteDC(hImageDC); SelectObject(hMaskDC, hOldMaskBMP); DeleteDC(hMaskDC); DeleteObject(hImageBMP); DeleteObject(hMaskBMP);} //用于没有掩码图,只有指定透明色,可以进行伸缩void CCommon::DrawTransBitmap( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 int nWidthSrc, // 源宽度 int nHeightSrc, // 源高度 COLORREF crTransparent // 透明色,COLORREF类型 )......{ HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图 HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图 HDC hImageDC = CreateCompatibleDC(hdcDest); HDC hMaskDC = CreateCompatibleDC(hdcDest); hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP); hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP); // 将源DC中的位图拷贝到临时DC中 if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc) ......{ BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY); } else ......{ StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY); } // 设置透明色 SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图 SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色 SetBkColor(hdcDest,RGB(0xff,0xff,0xff)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // “或“运算,生成最终效果 BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); SelectObject(hImageDC, hOldImageBMP); DeleteDC(hImageDC); SelectObject(hMaskDC, hOldMaskBMP); DeleteDC(hMaskDC); DeleteObject(hImageBMP); DeleteObject(hMaskBMP); }指定掩码图,和掩码图属于不同图片void CCommon::DrawTransBitmap( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC HDC hdcMask, int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 COLORREF crTransparent // 透明色,COLORREF类型 )......{ HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图 HDC hImageDC = CreateCompatibleDC(hdcDest);//临时DC hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP); // 将源DC中的位图拷贝到临时DC中,源DC已经载入位图 BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY); // 设置临时DC的透明色 SetBkColor(hImageDC, crTransparent); // 生成透明区域为黑色,其它区域保持不变的位图 SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcMask, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色 SetBkColor(hdcDest,RGB(255,255,255)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcMask, 0, 0, SRCAND); // “或“运算,生成最终效果 BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); // 清理、恢复 SelectObject(hImageDC, hOldImageBMP); DeleteDC(hImageDC); DeleteObject(hImageBMP);} 指定图片和掩码图同属于一张图片void CCommon::DrawTransBitmap(HDC hDC, int nPosX, int nPosY, int nCX, int nCY, HBITMAP hObj)......{ HDC hMemDC= CreateCompatibleDC(hDC); HBITMAP hOldBMP=(HBITMAP)::SelectObject(hMemDC,hObj); BitBlt(hDC,nPosX,nPosY,nCX,nCY, hMemDC,nCX,0,SRCAND); BitBlt(hDC,nPosX,nPosY,nCX,nCY, hMemDC,0,0,SRCPAINT); SelectObject(hMemDC,hOldBMP); DeleteDC(hMemDC);} HRGN CCommon::CreateBitmapRgn(int nWidth,int nHeight,HBITMAP hbmp, COLORREF TransColor)......{ HDC hmemDC; //创建与传入DC兼容的临时DC hmemDC = ::CreateCompatibleDC(NULL); HBITMAP hOldBmp = (HBITMAP)::SelectObject(hmemDC,hbmp);//创建总的窗体区域,初始region为0 HRGN hrgn; hrgn = ::CreateRectRgn(0,0,0,0);int y; for(y=0;y《nHeight ;y++) ......{ HRGN rgnTemp; //保存临时region int iX = 0; do ......{ //跳过透明色找到下一个非透明色的点. while (iX 《 nWidth && ::GetPixel(hmemDC,iX, y) == TransColor) iX++; //记住这个起始点 int iLeftX = iX; //寻找下个透明色的点 while (iX 《 nWidth && ::GetPixel(hmemDC,iX, y) != TransColor) ++iX; //创建一个包含起点与重点间高为1像素的临时“region” rgnTemp=::CreateRectRgn(iLeftX, y, iX, y+1); //合并到主“region“. CombineRgn( hrgn,hrgn,rgnTemp, RGN_OR); //删除临时“region“,否则下次创建时和出错 ::DeleteObject(rgnTemp); }while(iX 《nWidth ); iX = 0; }::SelectObject(hmemDC,hOldBmp); ::DeleteDC(hmemDC); return hrgn; }