疯狂的图形(利用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);
}
疯狂的图形(利用C# + GDI plus模拟杂乱无章的现实场景)相关推荐
- java编写的王八程序_利用JAVA多线程技术模拟龟兔赛跑.doc
利用JAVA多线程技术模拟龟兔赛跑 摘要:该文介绍了利用JAVA语言的多线程技术,对"龟兔赛跑"寓言故事的模拟.从模拟程序的具体设计思路,到详细的实现过程,将技术的应用融入到一个有 ...
- Matlab:利用Matlab编程实现模拟分子布朗运动的动画展示
Matlab:利用Matlab编程实现模拟分子布朗运动的动画展示 目录 输出结果 实现代码 输出结果 实现代码 %Brownian motion clf; n=20; s=0.02; x = rand ...
- Matlab:利用Matlab实现布朗运动模拟
Matlab:利用Matlab实现布朗运动模拟 目录 输出结果 实现代码 输出结果 实现代码 n=40 s=0.04 x=rand(n,1)-0.5; y=rand(n,1)-0.5; h=plot( ...
- 利用 MPI 进行蒙特卡洛模拟
参考 MPI对道路车辆情况的Nagel-Schreckenberg 模型进行蒙特卡洛模拟 实验题目 题目: 利用 MPI 进行蒙特卡洛模拟 内容: 在道路交通规划上,需要对单条道路的拥堵情况进行估计. ...
- 利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇
历史文章(文章累计440+) <国内最全的Spring Boot系列之一> <国内最全的Spring Boot系列之二> <国内最全的Spring Boot系列之三> ...
- html5手电筒样式,利用HTML5实现SVG模拟手电筒照明特效
特效描述:利用HTML5实现 SVG 模拟手电筒 照明特效.利用HTML5%20实现SVG模拟手电筒照明特效 代码结构 1. HTML代码 xmlns="http://www.w3.org/ ...
- chrome frame节点 取_爬虫3-下(利用Selenium + Chrome Driver模拟用户操作浏览器)
一.前言 前面利用request的方法爬取页面数据的操作,今天用另外一种方法:利用Selenium + Chrome Driver模拟用户操作浏览器,来爬取数据. 在此之前需要做一些准备工作:安装se ...
- 利用计算机的随机模拟结果帮助学生,对小学数学课堂教学有效性的思考
<对小学数学课堂教学有效性的思考>由会员分享,可在线阅读,更多相关<对小学数学课堂教学有效性的思考(11页珍藏版)>请在装配图网上搜索. 1.对小学数学课堂教学有效性的思考洱源 ...
- python模拟访问js_百度统计原理分析-利用PHP/Python实现模拟访问
国内大多数站长可能都在用百度统计.统计的使用方法也很简单,只要在需要统计的页面底部加上统计代码即可.然后打开百度统计的后台,就能看到访客信息,包括入口页面,停留时间,跳出率等等,很是方便. 使用当然是 ...
- 利用python requests库模拟登陆知乎
当初搜模拟登陆的时候在知乎上也找到一些内容. 以下是代码 import requests import time import json import os import re import sys ...
最新文章
- Swift2.x编写NavigationController动态缩放titleView
- 企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
- 说出一些数据库优化方面的经验?
- 解决国内GitHub加载慢的问题
- python 2x与python 3x是否兼容_使.next()与Python2和3兼容
- mysql根据id删除数据sql语句_sql delete根据id删除数据库
- Adaboost、RandomFrest、GBRT的区别
- Provisional headers are shown问题
- linux 开源中文字体,有哪些免费的中文字体可以下载?
- java毕业设计开题报告论文基于JavaWeb项目实现的高校学生在线选课系统
- PS中抠图的几种方法简介
- 计算机应用结课PPT,计算机应用说课.ppt
- Android 运行程序报错:Unable to execute dex: Multiple dex files define Lcom/baidu/android/pushservice/Push
- python条件句格式_python条件语句是什么?条件语句的一般格式是什么样的?
- 2018安恒杯11月月赛 MISC
- AMS5601开发 AB角度磁编码器
- Lanius大数据治理平台
- 《SVN宇宙版教程》:第九章 Subclipse必备技能
- Jenkins 流水线说明
- NBIOT模块 BC20 OPENCPU LWM2M协议传输数据到OneNet平台
热门文章
- 【车间调度】基于matlab多层编码遗传算法求解车间调度问题【含Matlab源码 035期】
- io流不关闭会怎么样_关闭IO流,你确定不试试trywithresources?
- 与Maggy统一单主机和分布式机器学习
- android view 画文字,【Android自定义View】绘图之文字篇(三)
- mysql mvcc 并发update_关于mysql的InnoDB多版本并发控制(MVCC)与事务隔离级别的疑问?...
- python:读取mat文件
- python统计时间的次数的代码_python脚本实现统计日志文件中的ip访问次数代码分享...
- netbeans linux 安装教程,linux下安装NetBeans 6.0
- php valid函数,PHP函数uasort()在类中的使用问题解决
- 大型项目开发: 隔离 (《大规模C++程序设计》书摘)