⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 global.cpp

📁 V《牛顿法解方程之混沌情况》源代码(C完整应用程序代码)
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		t3 = t1 * t1 - t2 * t2 + xx;
		t4 = 2 * t1 * t2 + yy;
		t1 = t3;
		t2 = t4;
	}
	*pX = t1;
	*pY = t2;
}
//=======================================================

/*
Option Explicit

'======================================================================
'图像数据RGB调整的基本函数 和 一些变量定义
'======================================================================

Public PicDataOld() As Byte '实现RGB调整时用来保存原图像的数据
Public PicDataNew() As Byte '实现RGB调整时用来保存调整后的图像的数据
Public PicLeng As Long      '实现RGB调整时用来保存图像数据的长度(字节)
Public PicBit   As Long     '实现RGB调整时用来保存图像的颜色位数

Public m_dRGBTime As Double


'++++++++++++更改图像RGB数据++++++++++++++
Public Sub EditRGB(RGBData0() As Byte, RGBData1() As Byte, dLeng As Long, PicBit As Long, dR As Long, dG As Long, dB As Long, RGBTimeNow As Double)
    '更改图像RGB数据(不考虑256色和16色)
    Dim i As Long
    Dim temp As Long
    Dim tempR As Long
    Dim tempG As Long
    Dim tempB As Long
    Dim tempColor As Long
            
    '如果把图片的颜色位数一早定为24位,则程序将变得很好处理,而且还有很多其他好处...
    Select Case PicBit
      Case 32     '32位色深
        For i = 0 To dLeng - 1
            Select Case (i Mod 4)
                Case 0
                    temp = RGBData0(i) + dB
                Case 1
                    temp = RGBData0(i) + dG
                Case 2
                    temp = RGBData0(i) + dR
                Case 3
                    temp = RGBData0(i) '透明度,一般给0就可以了
            End Select
            If temp > 255 Then
                temp = 255
            ElseIf temp < 0 Then
                temp = 0
            End If
            RGBData1(i] = temp
            If i Mod 50 = 0 Then
              DoEvents
              If RGBTimeNow <> m_dRGBTime Then
                Exit Sub
              End If
            End If
        Next i
      Case 24    '24位色深
        For i = 0 To dLeng - 1
            Select Case (i Mod 3)
                Case 0
                    temp = RGBData0(i) + dB
                Case 1
                    temp = RGBData0(i) + dG
                Case 2
                    temp = RGBData0(i) + dR
            End Select
            If temp > 255 Then
                temp = 255
            ElseIf temp < 0 Then
                temp = 0
            End If
            RGBData1(i] = temp
            If i Mod 50 = 0 Then
              DoEvents
              If RGBTimeNow <> m_dRGBTime Then
                Exit Sub
              End If
            End If
        Next i
      Case 16   '16位色深在某些机子上可能有问题,因为16位色编码方式是由硬件厂商决定的:
                '大部分机子采用的编码方式:R:9-13,G:14-16,1-3,B:4-8 (5,6,5)
                '某些机子上可能为 R:10-14,G:15-16,1-3,B:4-8,空(或作为是否透明标志):9  (5,5,5,1)
                '还有的机子为:R:9-14,G:15-16,1-3,B:4-8 (6,5,5)
                '由于没有查到相关资料(API函数:GetPixelFormat()和SetPixelFormat()),望高手指教: HouSisong@263.net
                
        tempColor = HGetPixelFormat(frmMain.Picture1)  '自己编的替代函数,16位色时返回具体编码方式。
        If tempColor = 565 Then '默认方式  R:9-13,G:14-16,1-3,B:4-8
            For i = 0 To dLeng \ 2 - 1
                tempB = RGBData0(2 * i) Mod 32
                tempG = RGBData0(2 * i) \ 32 + (RGBData0(2 * i + 1) Mod 8) * 8
                tempR = RGBData0(2 * i + 1) \ 8
    
                tempB = tempB + dB * 5 \ 8
                tempG = tempG + dG * 5 \ 8
                tempR = tempR + dR * 5 \ 8
                
                If tempB > 31 Then
                    tempB = 31
                ElseIf tempB < 0 Then
                    tempB = 0
                End If
                If tempG > 63 Then
                    tempG = 63
                ElseIf tempG < 0 Then
                    tempG = 0
                End If
                If tempR > 31 Then
                    tempR = 31
                ElseIf tempR < 0 Then
                    tempR = 0
                End If
                
                RGBData1(2 * i] = tempB + 32 * (tempG Mod 8)
                RGBData1(2 * i + 1] = tempG \ 8 + tempR * 8
                
                If i Mod 50 = 0 Then
                  DoEvents
                  If RGBTimeNow <> m_dRGBTime Then
                    Exit Sub
                  End If
                End If
            Next i
        ElseIf tempColor = 5551 Then '   R:10-14,G:15-16,1-3,B:4-8,空:9
            For i = 0 To dLeng \ 2 - 1
                temp = RGBData0(2 * i + 1) \ 128
                tempB = RGBData0(2 * i) Mod 32
                tempG = RGBData0(2 * i) \ 32 + (RGBData0(2 * i + 1) Mod 4) * 8
                tempR = (RGBData0(2 * i + 1) Mod 128) \ 4
    
                tempB = tempB + dB * 5 \ 8
                tempG = tempG + dG * 5 \ 8
                tempR = tempR + dR * 5 \ 8
                
                If tempB > 31 Then
                    tempB = 31
                ElseIf tempB < 0 Then
                    tempB = 0
                End If
                If tempG > 31 Then
                    tempG = 31
                ElseIf tempG < 0 Then
                    tempG = 0
                End If
                If tempR > 31 Then
                    tempR = 31
                ElseIf tempR < 0 Then
                    tempR = 0
                End If
                
                RGBData1(2 * i] = tempB + 32 * (tempG Mod 8)
                RGBData1(2 * i + 1] = tempG \ 8 + tempR * 4 + temp * 128
                
                If i Mod 50 = 0 Then
                  DoEvents
                  If RGBTimeNow <> m_dRGBTime Then
                    Exit Sub
                  End If
                End If
            Next i
        ElseIf tempColor = 655 Then 'R:6,G:5,B:5
            '没有处理代码
            '我在几台电脑上只测到了上面两种情况,这里留给读者解决
        End If
    End Select
End Sub

'16位色时返回图片具体编码方式
Public Function HGetPixelFormat(Pic As PictureBox) As Long
    '由于没有查到相关资料(GetPixelFormat()和SetPixelFormat()),望高手指教: HouSisong@263.net
    '其实可以向屏幕绘制一个指定颜色,然后返回实际绘制的颜色值来判断颜色编码方式。
    '这里留给读者解决
    HGetPixelFormat = 565
    
End Function
'=======================================================
*/


//BYTE PicDataOld[]; //实现RGB调整时用来保存原图像的数据
//BYTE PicDataNew[]; //实现RGB调整时用来保存调整后的图像的数据
//int PicLeng;       //实现RGB调整时用来保存图像数据的长度(字节)
//int PicBit;        //实现RGB调整时用来保存图像的颜色位数
//double m_dRGBTime;


//++++++++++++更改图像RGB数据++++++++++++++
void CGlobal::EditRGB(BYTE* pRGBData0, BYTE* pRGBData1, int dLeng, int PicBit, int dR, int dG, int dB, double RGBTimeNow)
{ //更改图像RGB数据(不考虑256色和16色)
	int i, temp, tempR, tempG, tempB, tempColor;

	//如果把图片的颜色位数一早定为24位,则程序将变得很好处理,而且还有很多其他好处...
	switch(PicBit)
	{
	case 32:     //32位色深
		for(i=0; i<dLeng; i++)
		{
			switch(i%4)
			{
			case 0:
				temp = pRGBData0[i] + dB;
				break;
			case 1:
				temp = pRGBData0[i] + dG;
				break;
			case 2:
				temp = pRGBData0[i] + dR;
				break;
			case 3:
				temp = pRGBData0[i]; //透明度,一般给0就可以了
				break;
			}
			if(temp > 255)
				temp = 255;
			else if(temp < 0)
				temp = 0;
			pRGBData1[i] = temp;
			if( !(i%50) ){
//				DoEvents
				if(RGBTimeNow != m_dRGBTime)
					return;
			}
		}
		break;
	case 24:    //24位色深
		for(i=0; i<dLeng; i++)
		{
			switch(i%3)
			{
			case 0:
				temp = pRGBData0[i] + dB;
				break;
			case 1:
				temp = pRGBData0[i] + dG;
				break;
			case 2:
				temp = pRGBData0[i] + dR;
				break;
			}
			if(temp > 255)
					temp = 255;
			else if(temp < 0)
					temp = 0;
			pRGBData1[i] = temp;
			if( !(i%50) ){
//				DoEvents
				if( RGBTimeNow != m_dRGBTime)
					return;
			}
		}
		break;
	case 16:
		//16位色深在某些机子上可能有问题,因为16位色编码方式是由硬件厂商决定的:
		//大部分机子采用的编码方式:R:9-13,G:14-16,1-3,B:4-8 (5,6,5)
		//某些机子上可能为 R:10-14,G:15-16,1-3,B:4-8,空(或作为是否透明标志):9  (5,5,5,1)
		//还有的机子为:R:9-14,G:15-16,1-3,B:4-8 (6,5,5)
		//由于没有查到相关资料(API函数:GetPixelFormat()和SetPixelFormat()),望高手指教: HouSisong@263.net
          
		tempColor = HGetPixelFormat();//frmMain.Picture1);  //自己编的替代函数,16位色时返回具体编码方式。
		if(tempColor == 565) //默认方式  R:9-13,G:14-16,1-3,B:4-8
		{
			for(i=0; i<dLeng/2; i++)
			{
				tempB = pRGBData0[2*i]%32;
				tempG = pRGBData0[2*i]/32 + (pRGBData0[2*i+1]%8)*8;
				tempR = pRGBData0[2*i+1]/8;

				tempB = tempB+dB*5/8;
				tempG = tempG+dG*5/8;
				tempR = tempR+dR*5/8;
      
				if(tempB > 31)
					tempB = 31;
				else if(tempB < 0)
					tempB = 0;
				if(tempG > 63)
					tempG = 63;
				else if( tempG < 0)
					tempG = 0;
				if(tempR > 31)
					tempR = 31;
				else if( tempR < 0)
					tempR = 0;
      
				pRGBData1[2*i] = tempB + 32*(tempG%8);
				pRGBData1[2*i+1] = tempG/8 + tempR*8;
      
				if( !(i%50) ){
					//DoEvents
					if(RGBTimeNow!=m_dRGBTime){
						return;
					}
				}
			}
		}
		else if(tempColor==5551) // R:10-14,G:15-16,1-3,B:4-8,空:9
		{
			for(i=0; i<dLeng/2; i++)
			{
				temp = pRGBData0[2*i+1]/128;
				tempB = pRGBData0[2*i]%32;
				tempG = pRGBData0[2*i]/32 + (pRGBData0[2*i+1]%4)*8;
				tempR = (pRGBData0[2*i+1]%128)/4;

				tempB = tempB + dB*5/8;
				tempG = tempG + dG*5/8;
				tempR = tempR + dR*5/8;
      
				tempB = tempB>31 ? 31 : (tempB<0 ? 0 : tempB);
				tempG = tempG>31 ? 31 : (tempG<0 ? 0 : tempG);
				tempR = tempR>31 ? 31 : (tempR<0 ? 0 : tempR);
      
				pRGBData1[2*i] = tempB + 32*(tempG%8);
				pRGBData1[2*i+1] = tempG/8 + tempR*4 + temp*128;
      
				if( !(i%50) ){
					//DoEvents
					if(RGBTimeNow!=m_dRGBTime){
						return;
					}
				}
			}
		}
		else if(tempColor == 655){ //R:6,G:5,B:5
				//没有处理代码
				//我在几台电脑上只测到了上面两种情况,这里留给读者解决
		}
	}
}

//16位色时返回图片具体编码方式
int CGlobal::HGetPixelFormat()//Pic As PictureBox)
{ //由于没有查到相关资料(GetPixelFormat()和SetPixelFormat()),望高手指教: HouSisong@263.net
	//其实可以向屏幕绘制一个指定颜色,然后返回实际绘制的颜色值来判断颜色编码方式。
	//这里留给读者解决
	//HGetPixelFormat = 565;
	return 565;
}
//=======================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -