《你是懂几何的》艺术集精选
Yusani_huh · · 休闲·娱乐
原理:使用 Windows 自带画图软件,C++ 精准控制鼠标作画。
提醒:
如果有读者需要使用以下代码,很抱歉我不会(其实是懒得)在这里提供任何关于代码原理的解释说明。以防万一,若没有 打开画图软件并将其窗口全屏显示,请谨慎调用 paint_clear 函数。最好在 调整代码内所有坐标数值与自己的屏幕分辨率适配 之后再调用 take_colour、take_tool 以及其他作图函数。
如确需获知代码原理,请自行搜索或洛谷私信我。二创不用联系本人,传播请标明原作者。(怎么会有人闲到干这种事来着)
UPD:因为现在这个代码已经成了一坨屎山,所以我打算在某个未知的时间进行全面重构。
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
#define M 100003
#define LL long long
#define db double
#define INF 0x3f3f3f3f
#define msdown mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0)
#define msup mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0)
#define more db theta=0
POINT p;
const db PI=acos(-1);
const db e=2.7182818284;
const db eps=1e-10;
int cl[13]={840,860,880,900,925,950,970};
db RA[M],RB[M],V[M],VR[M];
int w=960,c=540; //原点坐标,可调
int l=10,r=1900; //定义域,可调
int h[M],lr=16,li=10;
db get_dis(int xa,int ya,int xb,int yb){
db dx=xb-xa,dy=yb-ya;
return sqrt(dx*dx+dy*dy);
}
void take_colour(int a,int b)
{msup,SetCursorPos(a,b),msdown,msup;}
void take_tool(int a,int b)
{msup,SetCursorPos(a,b),msdown,msup;}
void paint_clear(){
keybd_event(0x11,0,0,0);
keybd_event(65,0,0,0);
keybd_event(65,0,KEYEVENTF_KEYUP,0);
keybd_event(0x11,0,KEYEVENTF_KEYUP,0);
keybd_event(0x2e,0,0,0);
keybd_event(0x2e,0,KEYEVENTF_KEYUP,0);
take_tool(360,70);
}
void ctrl_z(){
keybd_event(0x11,0,0,0);
keybd_event(90,0,0,0);
keybd_event(90,0,KEYEVENTF_KEYUP,0);
keybd_event(0x11,0,KEYEVENTF_KEYUP,0);
}
void init(){
Sleep(500);
SetCursorPos(931,7),msdown,msup;
Sleep(500);
}
void rotate(db &x,db &y,db theta){
db xx=x*cos(theta)-y*sin(theta);
db yy=x*sin(theta)+y*cos(theta);
x=xx,y=yy;
}
void draw_segment_p2p(int X1,int Y1,int X2,int Y2){
SetCursorPos(X1,Y1),msdown;
SetCursorPos(X2,Y2),msup;
}
void draw_circle(int X,int Y,int R){
for(int i=-R;i<=R;++i){
int x=X+i;
int y=-(sqrt(R*R-i*i))+Y;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
for(int i=R;i>=-R;--i){
int x=X+i;
int y=(sqrt(R*R-i*i))+Y;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_any_circle(int X,int Y,db A,db B,db theta){
int bb=1;
for(int i=0;i<=PI*200;++i){
db xx=cos(i/100.0)*A;
db yy=sin(i/100.0)*B;
int x=X+cos(theta)*xx-sin(theta)*yy;
int y=Y-sin(theta)*xx-cos(theta)*yy;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
// SetCursorPos(x,y);
// if(rand()%200<10)
// bb=(bb+1)%7,take_colour(cl[bb],90);
// SetCursorPos(x,y),msdown;
// SetCursorPos(w,c),msdown;
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_fans(int X,int Y,int R,db t,db a,bool k){
if(k) SetCursorPos(X,Y),msdown;
for(int i=0;i<=a*200;++i){
int x=X+cos(t+i/200.0)*R;
int y=Y-sin(t+i/200.0)*R;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
if(k) SetCursorPos(X,Y),msdown;
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_polygon(int X,int Y,int R,int A,db theta){
for(int i=0;i<=A;++i){
int x=X+cos(theta+i*PI*2/A)*R;
int y=Y-sin(theta+i*PI*2/A)*R;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_star(int X,int Y,int R,int A,db theta){
for(int i=0;i<=A;++i){
int x=X+cos(theta+i*PI*(A-1)/A)*R;
int y=Y-sin(theta+i*PI*(A-1)/A)*R;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_all(int X,int Y,int R,int A,db theta){
for(int k=2;k<A;k+=2){
take_colour(cl[(k/2)%7],64);
for(int i=0;i<=A;++i){
int x=X+cos(theta+i*PI*k/A)*R;
int y=Y-sin(theta+i*PI*k/A)*R;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
}
void draw_flower(int N,int X,int Y,db theta){
int bb=1;
for(int i=0;i<=PI*1000;++i){
db ag=i/500.0,xp=X,yp=Y;
for(int j=1;j<=N;++j)
xp+=cos(ag*V[j]+theta)*RA[j],
yp-=sin(ag*V[j]+theta)*RB[j];
int x=xp,y=yp;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y);
if(rand()%200<50)
bb=(bb+1)%7,take_colour(cl[bb],64);
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_flower2(int N,int X,int Y){
int bb=1;
for(int i=0;i<=PI*1000;++i){
db ag=i/500.0,xp=X,yp=Y;
for(int j=1;j<=N;++j)
xp+=RA[j]*cos(V[j]*ag)*cos(VR[j]*ag)-
RB[j]*sin(V[j]*ag)*sin(VR[j]*ag),
yp-=RA[j]*sin(V[j]*ag)*cos(VR[j]*ag)+
RB[j]*cos(V[j]*ag)*sin(VR[j]*ag);
int x=xp,y=yp;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
// SetCursorPos(x,y);
// if(rand()%200<50)
// bb=(bb+1)%7,take_colour(cl[bb],64);
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_out_wave(int X,int Y,int R1,int R2,int RE,db theta){
for(int i=0;i<=PI*300;++i){
db ag=i/150.0,v=R1*2.0/R2;
int x=X+cos(ag+theta)*(R1+R2)+cos(ag*v-PI+theta)*RE;
int y=Y-sin(ag+theta)*(R1+R2)-sin(ag*v-PI+theta)*RE;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_in_wave(int X,int Y,int R1,int R2,int RE,db theta){
for(int i=0;i<=PI*300;++i){
db ag=i/150.0,v=(R1-R2)/R2;
int x=X+cos(ag+theta)*(R1-R2)+cos(-ag*v+theta)*RE;
int y=Y-sin(ag+theta)*(R1-R2)-sin(-ag*v+theta)*RE;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_grid(int n,int m,int len){
int ws=w-m*len/2,cs=c-n*len/2;
int we=w+m*len/2,ce=c+n*len/2;
for(int i=0;i<=m;++i)
draw_segment_p2p(ws+i*len,cs,ws+i*len,ce);
for(int i=0;i<=n;++i)
draw_segment_p2p(ws,cs+i*len,we,cs+i*len);
}
void grid_flash(int X,int Y,int t){
int wp=w-150,cp=c-150;
X=wp+X*100,Y=cp+Y*100;
take_colour(925,64);
draw_polygon(X,Y,40,4,0);
Sleep(t),ctrl_z();
}//使用前要grid(4,4,100);
void grid_flash_flash(int X1,int Y1,int X2,int Y2,int t){
int wp=w-150,cp=c-150;
X1=wp+X1*100,Y1=cp+Y1*100;
X2=wp+X2*100,Y2=cp+Y2*100;
take_colour(860,64);
draw_polygon(X1,Y1,40,4,0);
Sleep(5);
draw_polygon(X2,Y2,40,4,0);
Sleep(t);
ctrl_z(),Sleep(5),ctrl_z();
}
void draw_segment(int X1,int Y1,int X2,int Y2,int lt=INF){
db dis=0,lth=lt/2.0,L=get_dis(X1,Y1,X2,Y2);
int lsx=-INF,lsy=-INF,dx=X2-X1,dy=Y2-Y1,s=L*2;
bool fl=true;
for(int i=0;i<=s;++i){
int x=X1+1.0*dx/s*i,y=Y1+1.0*dy/s*i;
if(lsx!=-INF) dis+=get_dis(x,y,lsx,lsy);
if(dis-lth>eps) msup,fl=!fl,dis=0,lth=lt;
if(fl) SetCursorPos(x,y),msdown;
lsx=x,lsy=y,Sleep(1);
}
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
void draw_square(int X1,int Y1,int X2,int Y2){
draw_segment_p2p(X1,Y1,X1,Y2);
draw_segment_p2p(X1,Y1,X2,Y1);
draw_segment_p2p(X2,Y1,X2,Y2);
draw_segment_p2p(X1,Y2,X2,Y2);
}
void oblique_two(int X1,int Y1,int Z1,
int X2,int Y2,int Z2,int lt=INF){
int Y1p=Y1*(sqrt(2)/4.0),Y2p=Y2*(sqrt(2)/4.0);
draw_segment(w+X1+Y1p,c-(Z1+Y1p),w+X2+Y2p,c-(Z2+Y2p),lt);
}
void draw_cube(int X1,int Y1,int Z1,int X2,int Y2,int Z2){
if(X1>X2) swap(X1,X2);
if(Y1>Y2) swap(Y1,Y2);
if(Z1>Z2) swap(Z1,Z2);
oblique_two(X1,Y1,Z1,X2,Y1,Z1);
oblique_two(X2,Y1,Z1,X2,Y2,Z1);
oblique_two(X1,Y1,Z1,X1,Y2,Z1,10);
oblique_two(X1,Y2,Z1,X2,Y2,Z1,10);
oblique_two(X1,Y1,Z2,X2,Y1,Z2);
oblique_two(X1,Y1,Z2,X1,Y2,Z2);
oblique_two(X1,Y2,Z2,X2,Y2,Z2);
oblique_two(X2,Y1,Z2,X2,Y2,Z2);
oblique_two(X1,Y1,Z1,X1,Y1,Z2);
oblique_two(X1,Y2,Z1,X1,Y2,Z2,10);
oblique_two(X2,Y1,Z1,X2,Y1,Z2);
oblique_two(X2,Y2,Z1,X2,Y2,Z2);
}
void draw_column(int n,int W,int H,int D){
int wp=w-W*n/2-D*(n-1)/2,cp=c+400;
for(int i=1;i<=n;++i)
draw_square(wp+(i-1)*W+(i-1)*D,cp,
wp+i*W+(i-1)*D,cp-h[i]*H);
}
int main(){
// while(1){
// GetCursorPos(&p);
// // SetCursorPos(114,514);
// cout<<p.x<<" "<<p.y<<endl;
// Sleep(100);
// }//该注释部分可用于检测鼠标的实时坐标
init();
paint_clear();
take_colour(770,64);
Sleep(100);
srand(time(0));
for(int k=1;k<=1;++k){
draw_all(w,c,300,17,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
return 0;
}
//屏幕分辨率1920*1080
//以(960,540)为原点
/*
画圆锥曲线
for(int i=w-a;i<=w+a;++i){
int x=i-w;
int y=-(sqrt((1-1.0*x*x/a/a)*b*b))+c;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(i,y),msdown;
Sleep(1);
}
画位运算图象
for(int i=10;i<=1900;++i){
for(int j=170;j<=1000;++j)
if(((i&j)+(i^j))==1000)
SetCursorPos(i,j),msdown,msup;
Sleep(1);
}
画你是懂旋转的
long db nw=300;
for(int i=0;i<=10;++i){
draw_polygon(w,c,nw,4,PI/4-i*atan(0.25));
nw*=sqrtl(17)/5;
}//里面的系数都可以改,但是改之前先算对。
画眼睛形
for(int i=w-240;i<=w+240;++i){
int x=i-w;
int y=-(sqrt((1-1.0*x*x/240/240)*130*130))+c+30;
if(y>c){msup;continue;}
SetCursorPos(i,y),msdown;
Sleep(3);
}//横着的
for(int i=c-80;i<=c+80;++i){
int y=i-c;
int x=-(sqrt((1-1.0*y*y/80/80)*40*40))+w+10;
if(x>w+3){msup;continue;}
SetCursorPos(x,i),msdown;
Sleep(3);
}//竖着的
画你是懂叠加的
int bb=0,cnt=0;
take_colour(840,64);
for(int i=0;i<=200;i+=10){
draw_any_circle(w,c,200-i,i),++cnt;
if(cnt>=3)
bb=(bb+1)%7,cnt=0,
take_colour(cl[bb],64);
}
画同心圆
int bb=0,cnt=0;
take_colour(840,64);
for(int i=300;i>=0;i-=5){
draw_polygon(w,c,i,i,0),++cnt;
if(cnt>=3)
bb=(bb+1)%7,cnt=0,
take_colour(cl[bb],64);
}
画出一种很怪的效果
for(int j=1;j<=10;++j){
RA[j]=RB[j]=rand()%80;
V[j]=rand()%20;
VR[j]=rand()%20;
take_colour(cl[bb],64),bb=(bb+1)%7;
draw_flower(j,w,c);
Sleep(1000);
paint_clear();
}
画摆线
for(int i=0;i<=PI*800;++i){
int x=w+cos(i/100.0+PI/2)*100+i-900;
int y=c+sin(i/100.0+PI/2)*100;
if(y>1000||y<170||x<10||x>1900)
{msup;continue;}
SetCursorPos(x,y),msdown;
Sleep(1);
}
画填色网格
take_tool(270,80);
for(int i=0;i<=60;++i)
draw_segment_withp(w-300+i*10,c-300,w-300+i*10,c+300),
draw_segment_withp(w-300,c-300+i*10,w+300,c-300+i*10);
take_tool(295,80);
for(int i=0;i<60;++i)
for(int j=0;j<60;++j){
take_colour(cl[rand()%7],64);
SetCursorPos(w-300+i*10+5,c-300+j*10+5);
msdown,msup;
Sleep(5);
}
画你是懂立体的
for(int i=0;i<=PI*200;++i){
int x=w+cos(i/100.0)*100;
int y=c-sin(i/100.0)*100;
take_colour(770,64);
draw_polygon(x,y,40,4,0);
Sleep(5);
take_colour(770,90);
draw_polygon(x,y,40,4,0);
}
*/
你是懂几何的
上半部是圆弧下半部是抛物线。
你是懂毛边的
尝试在作画时移动鼠标。莫名有感觉。
你是懂拜月的
粗制滥造的拜月。月亮是两个圆,文字是手打的。
你是懂正弦的
《画图里能画正弦函数》
你是懂抽象的
不是用 C++ 画的,但是感觉很好看。
你是懂颜色的
这是真的艺术我靠。
你是懂取整的
进行一个下取整函数的实现。
你是懂分形的
这是
你是懂椭圆的
实际上搞定了圆锥曲线。
你是懂变色的
实现了从工具栏中选取颜色的功能。在玩一种很新的东西。
你是懂填色的
顺便把填色实现了。
你是懂层次的
三组双曲线就有透视的感觉了。
你是懂涂鸦的
前现代抽象艺术。
你是懂画圆的
在为太多圆画不过来而发愁?封装了画圆函数。
你是懂高斯的
手搓正十七边形。
你是懂旋转的
硫酸的大作。
你是懂均轮的
这里只套了三个轮。
你是懂彩虹的
我知道颜色很俗但不妨碍看上去很艺术。
你是懂调色的
这样观感明显好些,并且颜色看起来也不是很俗了。
你是懂喷漆的
发现画图可以换笔触。
你是懂钢笔的
左边采用了一些措施使笔触不断。看下哪个观感好。
你是懂质感的
仍然喷漆,采用随机停顿以加深颜色。
你是懂干净的
鼠标移动的老套路,只不过看上去会让画布艺术性地脏起来。
你是懂线宽的
看起来比细线更厚重了。
你是懂坐标的
根据椭圆坐标为
你是懂叠加的
就只是很多个椭圆而已。
你是懂眼睛的
把椭圆上下缩起来就有眼睛形了。
你是懂饼图的
只能说是很新,但是不能说效果很好。
小圆的效果会好一些。
你是懂同心的
也算是一种填色不是吗。
蜡笔质感。
碰上彩虹,吃定彩虹。
你是懂和角的
使用和角公式(?)实现了椭圆的旋转。
你是懂成环的
点在旋转的椭圆上旋转。
你是懂形状的
有时候我们需要返璞归真一下。
有点太花了。
好像个什么东西的 LOGO。
你是懂摆线的
开摆。
你是懂偶然的
我真不知道这是怎么画出来的也不知道这是为什么能画出来的。
你是懂旋轮的
常规的心脏线和三尖瓣线。
你是懂旋转的 2
有时候最华丽的效果往往只需最简单的函数。
喷漆画不出多边形了,但是能显示你在哪里打了点。
你是懂虚线的
对虚线进行的初步尝试,很明显还是需要改进的。
这个还行。
你是懂填色的 2
饶有趣味。
你是懂立体的
事实上这个环只是一个意料之外的附带产物,本来应该啥都没有才对。
还可以做成这样。
你是懂立体的 2
虽然细节上略有误差,不过完成度还是很好的。
你是懂高斯的 2
手搓十七个点的完全图。