C++钢笔效果代码
  f7L79lyjPkIX 2023年11月02日 38 0

#include "StdAfx.h" #include "MyBrush.h" #include <math.h>

CMyBrush::CMyBrush(int nLength) { ASSERT(nLength >= 5 && nLength < 200);

m_nLength = nLength | 1;  //确保长度为奇数
m_nMid = m_nLength / 2;
m_pBuf = new BYTE [m_nLength * m_nLength];
memset(m_pBuf, 0, m_nLength*m_nLength);

for (int i=0; i<256; i++)
{
	for (int j=0; j<256; j++)
	{
		m_a256x256[i][j] = ((i+1) * (j+1) - 1) / 256;
	}
}

m_fWidthHalfCircle = 0.f;
m_nWidthHalfSuibi = 0;
m_aRGB[0] = m_aRGB[1] = m_aRGB[2] = 255;

}

CMyBrush::~CMyBrush(void) { if (m_pBuf != NULL) delete [] m_pBuf, m_pBuf = NULL; }

COLORREF CMyBrush::SetColor( COLORREF rgb ) { COLORREF clrOld = RGB(m_aRGB[0], m_aRGB[1], m_aRGB[2]); m_aRGB[0] = GetRValue(rgb); m_aRGB[1] = GetGValue(rgb); m_aRGB[2] = GetBValue(rgb); return clrOld; }

void CMyBrush::SetWidthSuibiBrush( int nWidth, BYTE gray ) { if (nWidth < 2) nWidth = 2; else if (nWidth > m_nLength) nWidth = m_nLength;

m_nWidthHalfSuibi = nWidth/2;
m_nHalfRect = m_nWidthHalfSuibi;
m_fWidthHalfCircle = 0.f; //将圆刷子宽度清0,确保与水笔刷子互斥

memset(m_pBuf, 0, m_nLength*m_nLength);

BYTE *pi = m_pBuf+(m_nMid-m_nHalfRect)*m_nLength;
for (int i = -m_nHalfRect; i<=m_nHalfRect; i++, pi += m_nLength) //初始化
{
	BYTE *pij = pi + (m_nMid - m_nHalfRect);
	for (int j=-m_nHalfRect; j<=m_nHalfRect; j++, pij++)
	{
		int sum = j - i;
		if (sum >= 0 && sum <= m_nWidthHalfSuibi) //两条平行线之间
		{
			*pij = gray;
		}
	}
}

}

void CMyBrush::SetWidthCircleBrush( float fWidth ) { if (fWidth < 1.f) { fWidth = 1.f; } else if (fWidth > m_nLength - 6.f) { fWidth = m_nLength - 6.f; }

if (abs(fWidth - 2*m_fWidthHalfCircle) < 0.001f)
	return;

m_nWidthHalfSuibi = 0; //将水笔刷子宽度清0
m_fWidthHalfCircle = fWidth / 2.f;
if (m_fWidthHalfCircle >= 3.f)
{
	m_fBorderInner = 1.0f;
	m_fBorderOuter = 1.0f;
	m_fBorderOuter2 = 1.0f;
}
if (m_fWidthHalfCircle >= 2.5f)
{
	m_fBorderInner = 0.75f;
	m_fBorderOuter = 1.0f;
	m_fBorderOuter2 = 1.25f;
}
else if (m_fWidthHalfCircle >= 2.0f)
{
	m_fBorderInner = 0.75f;
	m_fBorderOuter = 1.0f;
	m_fBorderOuter2 = 1.0f;
}
else if (m_fWidthHalfCircle >= 1.25f)
{
	m_fBorderInner = 0.75f;
	m_fBorderOuter = 0.75f;
	m_fBorderOuter2 = 1.0f;
}
else if (m_fWidthHalfCircle >= 0.75f)
{
	m_fBorderInner = 0.5f;
	m_fBorderOuter = 0.75f;
	m_fBorderOuter2 = 1.0f;
}
else if (m_fWidthHalfCircle >= 0.5f)
{
	m_fBorderInner = 0.5f;
	m_fBorderOuter = 0.75f;
	m_fBorderOuter2 = 0.75f;
}
else
{
	ASSERT(FALSE);
}

m_nHalfRect =int(m_fWidthHalfCircle + m_fBorderOuter + m_fBorderOuter2) + 1;
ASSERT(m_nHalfRect <= m_nMid);

memset(m_pBuf, 0, m_nLength*m_nLength);

BYTE *pi = m_pBuf+(m_nMid-m_nHalfRect)*m_nLength;
for (int i = -m_nHalfRect; i<=m_nHalfRect; i++, pi += m_nLength) //初始化圆刷子
{
	float i2 = i*i;

	BYTE *pij = pi + (m_nMid - m_nHalfRect);
	for (int j=-m_nHalfRect; j<=m_nHalfRect; j++, pij++)
	{
		float sum2 = i2 + j*j;
		float fDis = sqrt(sum2); //计算到圆心距离

		*pij = DisToGrayCircle(fDis);
	}
}

}

BYTE CMyBrush::DisToGrayCircle(float fDis) { BYTE byNode1 = 176; BYTE byNode2 = 32;

if (fDis <= m_fWidthHalfCircle - m_fBorderInner)
{
	return 255;
}
else if (fDis < m_fWidthHalfCircle) //内层模糊圈
{
	float fRatio = (m_fWidthHalfCircle - fDis)/m_fBorderInner;
	return int(fRatio*(255-byNode1))+byNode1;
}
else if (fDis < m_fWidthHalfCircle + m_fBorderOuter) ////外层模糊圈1
{
	float fRatio = (m_fWidthHalfCircle + m_fBorderOuter - fDis)/m_fBorderOuter;
	return int(fRatio*(byNode1-byNode2))+byNode2;
}
else if (fDis < m_fWidthHalfCircle + m_fBorderOuter + m_fBorderOuter2) ////外层模糊圈2
{
	float fRatio = (m_fWidthHalfCircle + m_fBorderOuter + m_fBorderOuter2 - fDis)/m_fBorderOuter2;
	return int(fRatio*byNode2);
}
else
{
	return 0;
}

}

BYTE CMyBrush::DisToGrayLine(float fDis) { fDis = abs(fDis);

float fk = 1.0f;
if (fDis > fk)
{
	return 0;
}
else
{
	float fRatio = (fk - fDis)/fk;
	return BYTE(fRatio*255);
}

}

C++钢笔效果代码_电子白板、钢笔笔锋、笔锋、c笔锋

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

f7L79lyjPkIX
作者其他文章 更多