疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)
本文给出了模拟竹叶、长叶草、杂乱石头、天上繁星等关键代码。使用.Net环境下C#语言,GDI+编写。
模拟竹叶
挺像的吧?谁说不像,我跟谁急!
//关键参数
int minCorners = 3;
int maxCorners =4;
PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 1.4f), (int)(perX * 0.009f), corners);
模拟长叶青草
说实话,这个不太像,太整齐了,应该再杂乱无章点。
//关键参数
int minCorners = 20;
int maxCorners =38;
PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.88f), (int)(perX * 0.01f), corners);
g.FillClosedCurve(Brushes.Green, points, FillMode.Winding);
模拟不规则的石块
这个……怎么有的石块总是多出来那么一点点,好像石头上长了草似的?如果被你发现,说明你是个细心的人。反之,说你粗心也不为过,哈哈!
//关键参数:
int minCorners = 3;
int maxCorners =4;
PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.4f), (int)(perX * 0.396f), corners);
g.FillClosedCurve(Brushes.Gray, points, FillMode.Winding);
天上星,亮晶晶
//关键参数:
int minCorners = 3;
int maxCorners =4;
PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.18f), (int)(perX * 0.06f), corners);
g.FillClosedCurve(Brushes.White, points, FillMode.Winding);
//关键代码:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
namespace ZPXP.Com.Util
{
public static class Stone
{
public static PointF[] CreateStone(Point center, int outerRadius, int inner_radius, int arms)
{
int center_x = center.X;
int center_y = center.Y;
PointF[] points = new PointF[arms * 2];
double offset = Math.PI / 2;
double arc = 2 * Math.PI / arms;
double half = arc / 2;
double angle = 0;
for (int i = 0; i < arms; i++)
{
Random randomOuter = new Random((int)DateTime.Now.Ticks);
outerRadius = outerRadius - randomOuter.Next((int)(inner_radius * 0.06 * new Random().Next(-20,20) /30d), (int)(inner_radius * 0.08));
//outerRadius = outerRadius - randomOuter.Next((int)(inner_radius * 0.16 * new Random().Next(-20, 20) / 30d), (int)(inner_radius * 0.18));
Random randomInner = new Random(Guid.NewGuid().GetHashCode());
inner_radius = inner_radius + randomInner.Next((int)(inner_radius * 0.02 * new Random().Next(-100,100) /150d), (int)(inner_radius * 0.08));
//inner_radius = inner_radius + randomInner.Next((int)(inner_radius * 0.02 * new Random().Next(-100, 100) / 150d), (int)(inner_radius * 0.22));
if (inner_radius > outerRadius)
{
int temp = outerRadius;
outerRadius = inner_radius;
inner_radius = temp;
}
double angleTemp = arc * randomInner.Next(-5, 5) / 10d;
angle = i * arc;
angle += angleTemp;
points[i * 2].X = (float)(center_x + Math.Cos(angle - offset) * outerRadius);
points[i * 2].Y = (float)(center_y + Math.Sin(angle - offset) * outerRadius);
points[i * 2 + 1].X = (float)(center_x + Math.Cos(angle + half - offset) * inner_radius);
points[i * 2 + 1].Y = (float)(center_y + Math.Sin(angle + half - offset) * inner_radius);
}
return points;
}
}
}
测试用代码:
private void button3_Click(object sender, EventArgs e)
{
int width = 500;
int height = 500;
int x = 0;
int y = 0;
int numX = 10;
int numY =10;
float perX = width * 1f / numX;
float perY = height * 1f / numY;
Bitmap image = new Bitmap(width, height);
Graphics g = Graphics.FromImage(image);
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.FillRectangle(Brushes.Black, new Rectangle(0,0, width, height));
int minCorners = 3;
int maxCorners =18;
int lastCorners = minCorners;
for (int i = 0; i < numX; i++)
{
for (int j = 0; j < numY; j++)
{
long tick = DateTime.Now.Ticks;
Random random = new Random((int)(tick & 0xffffffff) | (int)(tick >> 32));
int corners = random.Next(minCorners, maxCorners);
if (Math.Abs(corners - lastCorners) < (maxCorners - minCorners) / 2) corners = RetrievRandomCorners(minCorners, maxCorners);
lastCorners = corners;
//PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.9f), (int)(perX * 0.8f), corners);
PointF[] points = Stone.CreateStone(new Point((int)(perX * j), (int)(perY * i)), (int)(perX * 0.18f), (int)(perX * 0.06f), corners);
g.FillClosedCurve(Brushes.White, points, FillMode.Winding);
}
}
picEncode.Image = image;
}
private int RetrievRandomCorners(int minCorners, int maxCorners)
{
return new Random(Guid.NewGuid().GetHashCode()).Next(minCorners, maxCorners);
}
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java中的异常
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。 1. Java异常类层次结构图: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。 Throwable:有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。 Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemor...
- 下一篇
WPF在DLL中读取Resource的方法
原文: WPF在DLL中读取Resource的方法 WPF是个用户控件,被WinForm调用。而WinForm是在一个DLL类库中被调用。试了很多方法,都无法将Resource中的图读进程序。用下面的方法总算实现了。 /根据图片的名称,从资源中找到它 public static System.Drawing.Bitmap GetPngFromResources(string pngName) { /tp://www.worlduc.com/blog2012.aspx?bid=760294 c#访问Resources.resx中的资源 ResourceManager rmManager = global::AddMenuToRevit2013.Properties.Resources.ResourceManager; object obj = rmManager.GetObject(pngName); if (obj == null) { MessageBox.Show("未找到图片:" + pngName); return null; } System.Drawing.Bitmap ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题