开发

OpenGL开启Gouraud明暗处理,减少马赫夫效应

在我们建立三维模型的过程中,当用多边形网格或者是三角面片来近似的表示曲面的表面时,曲面被离散成许多的平面多边形,如果我们的网格较大,离散度较粗,在模型表面使用明暗处理后,两两相邻的多边形会出现凸起或者是凹陷的折痕,在连接处显得比周围处亮或者暗,这就是所谓的马赫夫效应,如下图所示 针对于出现的马赫夫效应,我们需要进行明暗处理,消除或者是减少三维模型的马赫夫效应,使其看上去更加的光滑美观,常用的明暗处理技术有双线性光强插值—Gouraud明暗处理技术和双线性法向插值-Phong明暗处理技术。以下展示经过明暗处理前后结果对比 OpenGL提供了两种着色模式void glShadeModel ( GLenum mode),恒定着色GL_FLAT,光滑着色GL_SMOOTH,而GL_SMOOTH中则是使用了Gouraud明暗处理技术,对于Phong明暗处理技术可以参见http://blog.csdn.net/dalewzm/article/details/46291397 http://blog.csdn.net/silangquan/article/details/10011169 Gouraud明暗处理算法在处理亮度的不连续性方面很有效,但是在明暗强度函数的斜率急剧变化处仍然可以看到马赫夫效应,不能完全消除光强度的不连续性。而Phong明暗处理是对表面的法向量而不是亮度进行插值,大大改善了Gouraud模型对高亮度镜面反射光的处理,在每一点都是用法向量的一个近似值,所以一般法向量插值的结果要优于亮度插值,在很大程度上消除了马赫夫效应,但是会大大增加明暗处理的时间。 鉴于此,我在用MC算法建立三维模型的时候,由于我的网格设置较大,导致出现了马赫夫效应,即模型表面的可视化效果不光滑,如下: 于是使用OpenGL自带的Gouraud明暗处理技术,以一个MC算法生成的章鱼模型为例子,效果如下 相比未使用明暗处理的模型,使用了Gouraud处理的模型从可视化的角度上来看更加的光滑,效果更好。

用Java实现给图片添加文字水印

程序背景 在网络中的很多地方都有水印的存在,比如微信公众号上面的图片,微博,以及这个CSDN博客上面的图片……所以突发奇想,看看自己能否写一个可以给图片添加水印的工具类。 程序代码 package image; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; /** * @author 白芷 * @Date 2017/03/12 * @use 利用Java代码给图片加水印 */ public class WaterMarkUtils { /** * @param srcImgPath 源图片路径 * @param tarImgPath 保存的图片路径 * @param waterMarkContent 水印内容 * @param markContentColor 水印颜色 * @param font 水印字体 */ public void addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent,Color markContentColor,Font font) { try { // 读取原图片信息 File srcImgFile = new File(srcImgPath);//得到文件 Image srcImg = ImageIO.

Deeplink:web唤醒app

在Android平台URI主要分五个部分:scheme, authority, path, queryParameter, queryString。其中authority又分为host和port。格式如下:(url的所有字母命名只能为小写) scheme://host:port/path?qureyParameter=queryString 例如:myscheme://www.febmaple.com:80/mypath?key=mykey 在Android的Manifest配置文件中,在要启动的activity下配置项中有配置。 其中包含内容有: <data android:host="" android:mimeType="" android:path="" android:pathPattern="" android:pathPrefix="" android:port="" android:scheme="" android:ssp="" android:sspPattern="" android:sspPrefix=""/> 1、web端html里写入 Click 2、android端在menifest的响应activity的intentfilter下配置,一般只需配置scheme和host即可。 3、这样手机系统自带浏览器碰到不能处理的scheme之后会发送intent给能处理的应用,因为我们的app可以处理该scheme,所以我的app得到启动。(ps:如果用webview加载html,webview碰到处理不了的scheme并不会发送intent找app处理,而系统自带浏览器是可以的,当然我们的需求就是用系统自带浏览器触发)。 Show u my code: 一、跳到app首页:新建一个app工程用webview加载所写的html,用以触发目标app。(实际需求是直接在系统浏览器里触发目标app) 1、建立html放到工程的main/assets目录下 </span> <html> <body> <h1>Test Schemeh1> <a href="myscheme://www.febmaple.com:80/mypath?key=mykey">Clicka> body> html> 2、webview加载本地html内容来触发目标app wvUrl.loadUrl("file:///android_asset/test.html"); 3、在app manifeset的**欢迎**activity添加intent-filter配置data标签. <activity android:name=".ui.launching.DemoLaunchingActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="myscheme"/> intent-filter> activity> 4、在配置好的Activity里即可获取外部跳转的参数信息。 @Override protected void onCreate(Bundle savedInstanceState) { super.

MD5登录+SQL用户名密码校验

这是一个winform程序,MD5计算,SQLserver表格数据查询,修改操作. 点击登录时,会将ID和转换成MD5值的密码 与数据库用户表中的信息作查询,由查询结果判断是否登录成功. 1.登录成功:可以使用修改密码button,(显示欢迎),点击修改密码,弹出新窗口,可以在新窗口中作修改密码操作(检验旧密码,确认新密码),存储在数据库中的密码依旧是MD5值 2.登录失败:由返回值确定是用户名不存在还是密码错误 登录 private void btnLogin_Click(object sender, EventArgs e) { string loginId = txtId.Text.Trim(); string loginPwd = CommonHelp.GetMD5FromString(txtPwd.Text).ToLower(); //校验用户名是否存在以及密码是否正确 string sql = "select CC_AutoId,CC_UserName,CC_LoginPassword from T_Seats where cc_loginId=@uid"; SqlParameter pms = new SqlParameter("@uid", loginId); //用户名密码的校验标记 bool userExist = false; bool pwdCorrect = false; using (SqlDataReader reader= SqlHelper.ExecuteReader(sql, CommandType.Text, pms)) { if (reader.HasRows) { userExist = true; if (reader.Read()) { //获取查询到的密码 string uPwd = reader.GetString(2); //密码比较 if (uPwd==loginPwd) { pwdCorrect = true; btn3.

C# Selenium-疑难杂症

C# Selenium-疑难杂症 发现网络上的C#Selenium文章好少,讲问题的就更少了。这个文章主要纪录一些疑难杂症和一些解决办法。本文中所用的是wedDriver 也就是Selenium2 1.StaleElementReferenceException(元素过期异常) 样子下下图; 在查找元素后,返回了元素对象的引用,但对象里是一堆异常。这里不会报错,只有调试才能看到,属于一个暗坑呀。。 解决办法:在查找元素前加一个延迟。比如点击后,要获取提示信息。那么应该在点击后延迟一点时间,给页面时间来反应。 2.stale element reference: element is not attached to the page document(过时元素引用:元素未附加到页面文档) 错误如下图: 这个错通常出现在找到页面元素,当页面元素变化后没有更新导致的。至于为什么会这样,我推测是元素依附的那个HTML文档是以前的,当没有重新获取,元素对象在新的页面中就消失了,所以会提示找不到了。 解决办法:重新用FindElement()方法找一次 3.no such element: Unable to locate element(没有这样的元素:无法定位元素) 错误下如图: 元素存在HTML中,但是代码中却报错。这会在页面上是处于隐藏的,当然不能找到拉! 还有一种是路径没有写对。虽然有多种方式,但我不太喜欢用Xpath来定位。Xpath是绝对路径,但我们平时要测试的网页大部分是变化的,那Xpath就需要老修改,不太方便。PS:这里说的变化是开发中修改网页、或是网页更新(百度首页也不可能几年都不变呀)。当HTML被加载后,只要不刷新或是DIV中没有发生网页填充,这时的HTML文档结构是短暂不变的 解决办法: 1.如果确认路径没有错的情况下,一点要模拟鼠标去写代码。比如这里,账户登录不点击的话,忘记密码是不会显示的,就定位不到了。 2.如果是路径的问题,尽量用唯一的去定位。比如连接中的文字(LinkText)、ID这些 未完待续

【Maven】—使用Idea创建maven webapp项目遇到的问题总结

操作步骤: 1.File–>New–>Project 2.选择maven-archetype-webapp 3.填写groupId和artifactId 4.填写maven settings文件的地址、本地仓库的地址 5.填写projectName 问题: 1.本机电脑上不同maven项目所用的仓库地址不一致,有的配置的是局域网内的地址,如果本机没处在局域网中就不能用。所以,我让自己电脑中的所有项目都使用一个本地仓库,但是为不同的项目配置不同的settings.xml。下面是我为自己试验项目配的settings.xml <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>D:\maven\repositorylocalRepository> <mirrors> <mirror> <id>alimavenid> <name>aliyun mavenname> <url>http://maven.aliyun.com/nexus/content/groups/public/url> <mirrorOf>centralmirrorOf> mirror> mirrors> settings> 所以在上面的步骤4时,需要修改user settings.xml文件的位置。 2.idea maven mvn archetype:generate 速度缓慢,控制台一直显示Generating project in Batch mode,状态栏一直Running。 webapp的archetype下载缓慢,项目的目录结构一直创建不出来。 我们需要在上述步骤的第4步时,添加一个属性项。这样archetype就不会从远程仓库加载。 archetypecatalog的值可以是remote,internal,local区别如下: remote,远程Maven库中提供的模板。mvn archetype:generate默认使用该类模板 internal,Apache Maven项目默认提供的模板。mvn archetype:generate -DarchetypeCatalog=internal使用该类模板 local,本地Maven库中提供的模板。mvn archetype:generate默认使用该类模板,作为remote的补充。Maven初始为空,执行mvn install时会将当前项目加入local模板库 总结: 1.archetype archetype: In short, Archetype is a Maven project templating toolkit。 maven-archetype-webapp : An archetype to generate a sample Maven Webapp project.

VS Code折腾记 – (3) 多图解VSCode基础功能

前言 想了想,对于一个刚接触VSCODE的人来说,有什么比图片更通俗易懂的呢? 界面&功能截图 启动界面 : 快捷键(Ctrl + Shift + E) Search && replace : 快捷键(Ctrl + Shift + H) Git: 快捷键(Ctrl + Shift + G) Debug: 快捷键(Ctrl + Shift + D) Extend: 快捷键(Ctrl + Shift + X) 结言 快过年啦,预祝大伙新年快乐,万事如意

阻止屏幕变暗进入休眠状态

阻止屏幕变暗进入休眠状态 //阻止屏幕变暗,慎重使用,缺省为no [UIApplication sharedApplication].idleTimerDisabled = YES; 慎重使用本功能,因为非常耗电。

mt19937 随机数

一下内容整理自网络资源: 我们讲的随机数其实暗指伪随机数。不少朋友可能想到C语言的rand(),可惜这个函数产生的随机数随机性非常差,而且速度很慢,相信几乎不能胜任一般的应用。 古老的LCG(linear congruential generator)代表了最好的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。这种算法数学上基于X(n+1) = (a * X(n) + c) % m这样的公式,其中: 模m, m > 0 系数a, 0 < a < m 增量c, 0 <= c < m 原始值(种子) 0 <= X(0) < m 其中参数c, m, a比较敏感,或者说直接影响了伪随机数产生的质量。 一般而言,高LCG的m是2的指数次幂(一般2^32或者2^64),因为这样取模操作截断最右的32或64位就可以了。多数编译器的库中使用了该理论实现其伪随机数发生器rand()。下面是部分编译器使用的各个参数值: Source m a c rand() / Random(L)的种子位 Numerical Recipes 2^32 1664525 1013904223 Borland C/C++ 2^32 22695477 1 位30..16 in rand(), 30..0 in lrand() glibc (used by GCC) 2^32 1103515245 12345 位30.

Win10白色图标制作及替换

win10白色图标制作: 一、软件准备IcoFX:提取图标、生成图标。 Photoshop:修改编辑图标。 二、制作步骤1、 提取图标打开IcoFX,直接在桌面上选择快捷方式,拉拽以icoFX打开。 打开后提取图标 打开图标后保存为:png格式 2,然后使用ps打开,开始编辑 先建立一块透明背景,256×256就够了,然后打开图片,将需要保留的白色部分保留,删除其他部分,或者根据自己的需要自定义 1,点击魔术棒,选择白色区域以外的地方,删除 删除不需要的地方,保留需要的地方,然后使用白色前景色,再用油漆桶将需要的地方涂为白色 弄好之后就是上面的那张图片,然后保存,做好的图片在次使用icoFX打开,选择创建一个图标 然后保存为图标之后就可以开始替换了。 替换图标: 替换图标的方式有多种,我只说两种我用的。 1,图标可以放在统一的地方,也可以放在程序安装路径 桌面快捷方式右键——属性——–打开文件位置——-然后将图标移动到此处——-在回去属性页面点击更换图标——–浏览找到图标位置—-替换成功 2.用exe资源查看器(我用的Restorator 2007)打开程序exe文件,然后找到图标,用制作的白色图标替换,然后保存,软件会自动帮助备份 注意:exe替换成功后有些软件会将通知栏图标也变为白色,但有些软件不会,exe替换成功后需要清理一下 Windows通知区域图标历史记录 在网上找到的方法是下面这两种:第一种方法,手工修改注册表:1、按“Win R”组合键,输入“regedit”打开注册表编辑器,然后打开如下键值: HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify 在右边你可以看到两个键值:IconStreams和PastIconsStream,将它们的值删除。2、然后调出任务管理器将进程“explorer.exe”终止,再在任务管理器中点击“文件——新建任务”,输入“explorer”,回车,以此重新启动该系统进程。(或者重新启动计算机)。现在再来查看一下通知区域的图标,过期的图标已经被成功清理了。第二种方法:用批处理文件清理Windows通知区域图标历史记录:第一种方法虽好,但是有点技术问题在其中,对于菜鸟们来说有点难度,有没有简单的方法?网上有人提供了一个BAT批处理小工具,专门用来清理Windows通知区域图标历史记录。这个BAT文件安全性高,不会造成系统损坏,适用于当前主流的Windows7\vista\XP系统,使用如图所示: bat清理我只在win7上用过,在win10上还没有测试 批处理: @ ECHO OFF SET PROG=清理系统通知区域 (XP/WIN7/VISTA) COLOR 0a @ ECHO. @ ECHO. 说 明 @ ECHO. @ ECHO ——————————————————————————– @ ECHO. @ ECHO. WINDOWS 系统能在通知区域自动隐藏不活动的图标,这是个非常实用的功能。但是日积 @ ECHO.月累之下,通知区域的图标越来越多,有的是很久之前的图标,甚至该软件已经卸载。图标 @ ECHO.的增多不仅臃肿且看起来十分的不舒服。此批处理文件能帮你清理掉通知区域的历史图标。 @ ECHO. @ ECHO ——————————————————————————– TITLE %PROG% PAUSE CLS @ ECHO. @ ECHO.