ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

توابع ریاضی و ویژوال بیسیک مقدمه درس سوم :

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:TimesNewRoman; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"\@MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:FantasyMatrix; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:FantasyMatrixSmall; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Jokerman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"HolidayPi BT"; panose-1:5 12 1 2 1 2 9 2 2 2; mso-font-charset:2; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"OldDreadfulNo7 BT"; panose-1:4 8 8 5 6 1 7 1 8 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"MisterEarl BT"; panose-1:3 8 8 2 2 3 2 2 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Calligraph421 BT"; panose-1:3 6 7 2 5 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Blackletter686 BT"; panose-1:3 4 8 2 2 6 8 4 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Cataneo BT"; panose-1:3 2 8 2 4 5 2 6 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Staccato222 BT"; panose-1:3 9 7 2 3 4 7 2 4 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"ParkAvenue BT"; panose-1:3 2 6 2 5 5 6 8 7 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Square721 BT"; panose-1:2 11 5 4 2 2 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Broadway BT"; panose-1:4 4 9 5 8 11 2 2 5 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:"Scruff LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Odessa LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Highlight LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"One Stroke Script LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Mekanik LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Tiranti Solid LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Pump Demi Bold LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Quixley LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"La Bamba LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Rage Italic LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Ruach LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Westwood LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Milano LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Victorian LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Academy Engraved LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Orange LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"John Handy LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Jokerman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:ZWAdobeF; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:536885895 0 0 0 511 0;} @font-face {font-family:"Euro Sign"; panose-1:2 11 6 3 2 2 1 2 1 1; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 2 0 0 1 0;} @font-face {font-family:"Lucida Bright"; panose-1:2 4 6 3 7 5 5 2 4 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

 

 

١

توابع ریاضی و ویژوال بیسیک مقدمه درس سوم :

١۵١

مقدمه :

نسبت به تمام کنترلهای اینترنت در سطح پایینتری WinSock کنترل

قرار دارد . این کنترل امکان ایجاد سرویسهای شبکه ای مبتنی بر

را مهیا می کند . بعبارت دیگر توسط این UDP و TCP پروتکلهای

سرویس گیرنده ) Client/Server کنترل می توان برنامه های کاربردی

بین UDP و یا TCP / سرویس دهنده ) ایجاد و با استفاده از پروتکل

آنها ارتباط برقرار نمود .

با تنظیم خصوصیات و فراخوانی متدهای این کنترل می توانید به

راحتی به یک کامپیوتر راه دور متصل شوید و داده ها را در هر دو جهت

جابجا نمائید . نمونه کاربرهایی که می توان با این کنترل ایجاد نمود :

Proxy Server ،Mail server ،Mail client ، Client-server chat

پیاده سازی الگوریتم های ، Port Scanner ،Network Game ،

موازی و

: TCP مبانی

اجازه می ( Transfer Control Protocol ) پروتکل کنترل اینترنت

به یک ( socket ) را از طریق سوکت ( Connection ) دهد یک اتصال

ساخته و استفاده کنید . با ( Remote Computer ) کامپیوتر راه دور

استفاده از این اتصال ، هر دو کامپیوتر می توانند داده ها را بین

همانند صحبت TCP خودشان انتقال دهند . برقراری ارتباط از طریق

کردن با تلفن است که باید حتماً اتصالی بین دو کامپیوتر صورت گیرد

تا بتوانند با هم ارتباط برقرار کنند .

IP می سازید بایستی بدانید که نام یا آدرس Client اگر یک برنامه

و همچنین از طریق چه ( Remote Host IP ) چیست Server کامپیوتر

حال بایستی . ( Port Remote ) پورتی می توانید به آن متصل شوید

کنید . Connect به آن پورت

١۵٢

می سازید بایستی پورتی را که روی آن Server همچنین اگر یک برنامه

و سپس به ( LocalPort ) به درخواستها گوش می دهید مشخص کنید

. ( Listen ) پورت گوش دهید

این Server تقاضای یک اتصال را می دهد Client زمانیکه یک کامپیوتر

می کند . Accept درخواست را

زمانیکه یک اتصال ساخته می شود ، هر دو کامپیوتر می توانند داده را

فرستاده و دریافت کنند .

!Error

: UDP مبانی

پروتکلی بدون ( User Datagram Protocol ) پروتکل دیتاگرام کاربر

کامپیوترها نیاز به ، TCP است . برخلاف ( Connectionless ) اتصال

و client برپا کردن یک اتصال ندارند بنابراین یک برنامه می تواند یک

شبیه ارسال نامه از UDP باشد . برقراری ارتباط در server یا یک

طریق پست است .

Client کامپیوتر Local Port ابتدا باید UDP برای انتقال داده توسط

١۵٣

را برابر RemoteHost تنها بایستی Server تنظیم گردد . کامپیوتر

را همان Remote Port قرار دهد و همچنین Client آدرس کامپیوتر

قرار دهد . سپس دو کامپیوتر می توانند Client کامپیوتر Local Port

داده ها را بین خود جابجا کنند .

: WinSock استفاده از کنترل

اولین کاری WinSock 1 – انتخاب پروتکل: در زمان استفاده از کنترل

است . UDP یا TCP که باید انجام دهید انتخاب یکی از پروتکلهای

طبیعت برنامه ای که شما می سازید نوع پروتکلی را که باید استفاده

کنید مشخص می کند . چند سوال زیر به شما کمک می کند که پروتکل

مورد نیازتان را انتخاب کنید :

- آیا برنامه شما در زمانیکه داده فرستاده می شود یا دریافت می شود

دارد ؟ اگر چنین است Client یا Server نیاز به اطلاعاتی از طرف

قبل از ارسال یا دریافت داده ایجاد شود . TCP بایستی یک اتصال

- آیا داده بسیار بزرگ است ( مثل تصویر یا فایلهای صوتی ) ؟ زمانیکه

اتصال را باقی نگه می TCP ساخته می شود پروتکل TCP یک اتصال

دارد و درستی ارسال داده تضمین شده است . این اتصال در هر حال به

١۵۴

منابع محاسباتی بیشتری نیاز دارد و بنابراین پرهزینه تر است .

ارسال ( Session ) - آیا داده متناوب ارسال می شود یا در یک نشست

خواهد شد ؟ برای مثال اگر شما یک برنامه می سازید که کامپترهای

مشخصی را در یک زمان خاص از انجام شدن عملیاتی مطلع می کند

همچنین برای ارسال UDP مناسب تر است . پروتکل UDP پروتکل

مقادیر کوچک داده ای مناست تر می باشد .

2 – تنظیم پروتکل : برای تنظیم پروتکلی که می خواهید در برنامه تان از

کنترل Protocol آن استفاده کنید در زمان طراحی برنامه خاصیت

قرار sckUDPProtocol و یا sckTCPProtocol را برابر WinSock

دهید . همچنین می توانید پروتکل خود را توسط کد زیر تنظیم کنید :

WinSock.Protocol=sckTCPProtocol

3 – مشخص کردن نام کامپیوتان : برای اتصال به کامپیوتر راه دور

و یا نام کامپوتر را بدانید . IP بایستی آدرس

موجود Control Panel/Network/Identification نام کامپیوتر در

خود را Server و Client است . در صورتیکه می خواهید دو برنامه

برای هر دو IP روی یک کامپیوتر تست کنید از آدرس 127.0.0.1

استفاده کنید اما اگر دو برنامه را روی دو کامپیوتر مجزا در شبکه قرار

می توانید آدرس DOS Prompt در ipconfig داده اید با اجرای دستور

کامپیوتر ها را بدست آورید . IP

TCP در زمان ساخت برنامه ای که از پروتکل : TCP 4 – ایجاد اتصال

است یا Client استفاده می کند ابتدا باید تصمیم بگیرید که این برنامه

بایستی روی یک پورت خاص Server برای ساخت یک برنامه . Server

تقاضای یک اتصال را می دهد ، برنامه Client کنید . زمانیکه Listen

کند و بنابراین اتصال کامل شده است . Accept می تواند آنرا Server

١۵۵

می توانند با هم ارتباط داشته باشند . Server و Client حال

را نشان می دهد : TCP مراحل زیر ساخت یک سرور چت ساده بر مبنای

را انتخاب کنید و در لیست Components گزینه Project - از منوی

را انتخاب کنید . Microsoft WinSock ها مورد 6.0 Component

tcpserver در فرم خود قرار دهید و نام آنرا WinSock - یک کنترل

بگذارید

و نیز یک txtReceiveData و txtSendData با نامهای textbox - دو

دکمه در فرم قرار دهید .

بنویسید : Form_Load - کد زیر را در رویداد

Tcpserver.LocalPort=1000

tcpserver.Listen

می آید رویداد Client - زمانیکه درخواستی از طرف

اجرا می شود . در این رویداد ابتدا باید چک کنید ConnectionRequest

که حالت کنترل بسته باشد . اگر چنین نیست اتصال را قبل از پذیرفتن

می requestID اتصال جدید ببندید . سپس تقاضا را بر اساس پارامتر

پذیریم :

Private Sub tcpserver_ConnectionRequest(ByVal

(requestID As Long

tcpserver.Close sckClosed Then <> If tcpserver.State

tcpserver.Accept requestID

End Sub

برقرار شده است . کد زیر را برای Server و Client - حال اتصال بین

بنویسید : Send مربوط به کلیک دکمه event

١۵۶

Tcpserver.SendData txtSendData.text

اجرا می شود DataArrival بیاید رویداد Client - اگر داده ای از طرف

. کد زیر را برای این رویداد بنویسید :

As Private Sub tcpserver_DataArrival(ByVal bytesTotal

(Long

Dim strData As String

strData tcpserver.GetData

txtReceiveData.Text = strData

End Sub

بنویسید : Form_Unload - کد زیر را برای رویداد

Tcpserver.Close

بصورت زیر است : TCP Client مراحل ساخت یک

بگذارید . tcpclient در فرم قرار دهید و نام آنرا WinSock - یک کنترل

و نیز یک دکمه با نام txtreceive و txtsend با نامهای textbox - دو

در فرم قرار دهید . send

در فرم قرار دهید . connect - یک دکمه با نام

بنویسید : Form_Load - کد زیر را برای متد

tcpclient.RemoteHost=”yourservername”x

tcpclient.RemotePort=1000

بنویسید : connect - کد زیر را برای رویداد کلیک شدن دکمه

tcpclient.Connect

بنویسید : send - کد زیر را برای رویداد کلیک شدن دکمه

١۵٧

tctclient.SendData txtsend.Text

بنویسید : DataArrival - کد زیر را برای رویداد

As Private Sub tcpclient_DataArrival(ByVal bytesTotal

(Long

Dim strData As String

strData tcpclient.GetData

txtreceive.Text = strData

End Sub

بنویسید : Form_Unload - کد زیر را باری رویداد

Tcpclient.Close

ساده را نشان می دهد . فایل Client-Server کدهای فوق یک سیستم

هر دو برنامه را بسازید و آنها را اجرا کنید تا بتوانید سیستم خود exe

را تست کنید .

ای که در بالا ساخته Server : 5 – پذیرفتن بیش از یک تقاضای اتصال

شد تنها می تواند تقاضای یک اتصال را بپذیرد . با استفاده از ایجاد یک

می توان چندین تقاضای اتصال را پذیرفت . WinSock آرایه از کنترل

از کنترل بسازیم ( با تنظیم ( instance ) برای اینکار کافی است یک کپی

جدید بکار ببریم . instance را برای Accept و متد ( Index خاصیت

در فرم داریم که sckServer با نام WinSock فرض کنید یک کنترل

از intMax آنرا صفر قرار داده ایم . همچنین یک متغیر Index خاصیت

را نگه Server تعریف می کنیم که تعداد اتصالات همزمان به Long نوع

کد زیر را بنویسید : Form_Load مربوط به event می دارد . در

١۵٨

intMax=0

sckServer(0).LocalPort=1000

sckServer(0).Listen

هر بار که تقاضای یک اتصال می رسد کد ابتدا تست می کند که مقدار

یکی intMax صفر باشد متغیر Index چقدر است . اگر مقدار Index

جدید از کنترل instance برای ساخت یک intMax افزایش می یابد و از

برای پذیرفتن تقاضای اتصال instance استفاده می شود . حال از این

استفاده می گردد . برای اینکار کد زیر را برای رویداد

بنویسید : ConnectionRequest

Private Sub sckServer_ConnectionRequest(Index As

(Integer, ByVal requestID As Long

If Index = 0 Then

1 + intmax = intmax

Load sckServer(intmax)x

0 = sckServer(intmax).LocalPort

sckServer(Index).Accept requestID

End If

End Sub

ساده تر از برنامه های UDP ساخت یک برنامه : UDP 6 – ایجاد اتصال

TCP به اتصال نیاز ندارد . در برنامه UDP است زیرا پروتکل TCP

می کرد و یک کنترل Listen بایستی حتما WinSock بالا یک کنترل

ایجاد نمود . در عوض پروتکل Connect دیگر یک اتصال را توسط متد

نیازی به اتصال ندارد . برای ارسال داده بین دو کنترل UDP

سه مرحله بایستی انجام شود : WinSock

برابر نام کامپیوتر مقابل است . RemoteHost - پارامتر

کامپیوتر مقابل LocalPort برابر پارامتر RemotePort - پارامتر

١۵٩

LocalPort برای مشخص کردن Bind - استفاده از متد

چون هر دو کامپیوتر از نظر ارتباط مساوی هستند ، این نوع برنامه ها

گویند . برای نمونه از کد زیر برای ساخت یک برنامه Peer-to-Peer را

استفاده می کنیم : chat

بگذارید udppeerA در فرم قرار دهید و نام آنرا WinSock - یک کنترل

.

قرار دهید . UDPProtocol آنرا Protocol - خاصیت

و نیز یک دکمه در فرم txtreceive و txtsend با نامهای textbox - دو

قرار دهید .

بنویسید : Form_Load - کد زیر را برای متد

udppeerA.RemoteHost=”nameofpeerB”x

udppeerA.RemotePort=1001

1002 udppeerA.Bind

مربوط به کلیک دکمه بنویسید : event - کد زیر را برای

udppeerA.SendData txtsend.text

بنویسید : DataArrival - کد زیر را برای رویداد

Dim strData as String

strData udppeerA.GetData

txtreceive.Text=strData

مشابه مراحل بالا عمل کنید فقط خاصیت UDP peerB برای ساخت

آنرا RemotePort و خاصیت PeerA آنرا نام کامپیوتر RemoteHost

آنرا 1001 قرار دهید . Bind 1002 و خاصیت

١۶٠

قسمت دوم - WinSock کنترل

: WinSock بررسی خواص کنترل

را ( receive مقدار داده دریافت شده ( موجود در بافر : ByteReceived

می توان این داده را دریافت نمود . GetData نشان می دهد . توسط متد

نام ماشین محلی را نشان می دهد . این پارامتر : LocalHostName

فقط خواندنی است .

برمی گرداند . string ماشین محلی را بصورت یک IP آدرس : LocalIP

این پارامتر فقط خواندنی است .

برای خواندن و یا تنظیم شماره پورت محلی بکار می رود . : LocalPort

برای خواندن و یا تنظیم پروتوکل مورد استفاده توسط : Protocol

بکار می رود . WinSock کنترل

ماشین راه IP برای خواندن و یا تنظیم نام یا آدرس : RemoteHost

دور بکار می رود .

ماشین راه دور را برمی گرداند : IP آدرس : RemoteHostIP

بعد از زمانیکه یک اتصال توسط متد Client -1 برای برنامه های

ماشین راه دور IP پذیرفته شد ، این خاصیت حاوی آدرس Connect

است .

این Request Connection بعد از آمدن یک ، Server 2 - برای برنامه

ماشین راه دور است . IP خاصیت شامل آدرس

Data بعد از اینکه رویداد UDP 3 - در زمان استفاده از پروتکل

http://sheidaian.persianblog.com

http://iranmehr.bizhat.com توسط گروه ایران مھر sheidaian.persianblog برگرفتھ از سایت

١۶١

ماشینی است که داده را IP رخ داد این خاصیت حاوی آدرس Arrival

فرستاده .

برای خواندن و یا تنظیم شماره پورت ماشین راه دوری : RemotePort

که می خواهید به آن متصل شوید بکار می رود .

مقداری را برمی گرداند که مرتبط با سوکتی است که : SocketHandle

WinSock را مدیریت می کند و برای ارتباط با لایه WinSock کنترل

API بکار می رود . این پارامتر فقط خواندنی است و تنها برای ارسال به

طراحی شده است . WinSock های

را نشان می دهد . وضعیتهای ممکن WinSock وضعیت کنترل : State

عبارتند از : State برای

اتصال بسته است . : sckClosed - 1

اتصال باز است . : sckOpen - 2

حالت گوش دادن به پورت : sckListening - 3

معلق شدن اتصال : sckConnectionPending - 4

تصمیم گیری در مورد میزبان : sckResolvingHost - 5

در مورد میزبان تصمیم گیری شد . : sckHostResolved - 6

حالت برقراری ارتباط : sckConnecting - 7

ارتباط برقرار شد . : sckConnected - 8

حالت قطع اتصال : sckClosing - 9

حالت خطا : sckError - 10

١۶٢

: WinSock بررسی متدهای کنترل

بکار می رود . این TCP Server تنها برای برنامه های : Accept متد

متد برای پذیرفتن یک اتصال در زمان مدیریت رویداد

استفاده می شود . ConnectionRequest

یک اتصال را مشخص LocalIP و LocalPort این پارامتر : Bind متد

می کند .

listening و یا بستن یک TCP برای بستن یک اتصال : Close متد

بکار می رود . socket

بلوک جاری داده دریافت شده را گرفته و آنرا در : GetData متد

ذخیره می کند . شکل کلی این متد بصورت زیر Variant متغیری از نوع

است :

WinSock.GetData data[,type][,maxlen]x

برابر data داده دریافتی است . اگر داده کافی موجود نباشد data که

خواهد بود . empty

١۶٣

نوع داده دریافتی است که می تواند مقادیر زیر باشد : type

vbInteger - vbLong - vbSingle - vbDouble - - vbByte

vbString - - vbDate - vbBoolean - vbError

vbArray+vbByte

و یا یک byte Array حداکثر سایز را در زمان دریافت یک maxlen

مشخص می کند . string

استفاده می شود که این رویداد Data Arrival در رویداد Getdata متد

ای که شما تعیین maxlen دارد . اگر TotalBytes یک پارامتر با نام

باشد پیغام هشدار شماره 10040 دریافت TotalBytes کرده اید کمتر از

می کنید بدین معنی که بایتهای باقیمانده گم خواهند شد .

قرار می دهد . Listen یک سوکت می سازد و آنرا در حالت : Listen متد

بکار میرود . TCP این متد تنها در اتصالات

است با این تفاوت که داده را از صف GetData مشابه : PeekData متد

بکار می رود . TCP ورودی حذف نمی کند . این متد تنها برای اتصالات

برای ارسال داده به کامپیوتر راه دور بکار می رود . : SendData متد

: WinSock های کنترل event بررسی

زمانی رخ می دهد که کامپیوتر راه دور اتصال را ببندد . : Close رویداد

ایجاد شد روی می Server بعد از اینکه یک اتصال به : Connect رویداد

دهد . شکل کلی آن بصورت زیر است :

Private Sub WinSock_Connect(ErrorOccurred As

Boolean)x

باشد یعنی True دو مقدار دارد : اگر ErrorOccurred که پارامتر

باشد یعنی اتصال با موفقیت انجام False شده است و اگر Fail اتصال

شده است .

هایی که در زمان فرایند باز کردن error می توانید Connect با رویداد

١۶۴

اتصال برگردانده شده را چک کنید .

زمانی رخ می دهد که یک کامپیوتر راه : ConnectionRequest رویداد

TCP دور تقاضای یک اتصال را بدهد . این رویداد فقط برای برنامه های

بکار می رود . Server

زمانی رخ می دهد که داده جدیدی بیاید . : DataArrival رویداد

زمانی رخ می دهد که یک خطا در فرایند ارتباط رخ دهد ( : Error رویداد

شکل کلی آن . ( Failed to Send و یا Failed to Connect مثلا

بصورت زیر است :

as Private WinSock_Error(number as Integer,description

String,scode as Long,source as String,helpfile as

Long,canceldisplay as Boolean)x String,helpcontext as

شماره کد خطا است . number

توضیحی در مورد خطا است . description

توصیف منبع خطا source

مشخص می کند آیا پیغام خطای پیش فرض نشان : canceldisplay

داده شود یا نه

تکمیل Send زمانی رخ می دهد که یک عمل : SendComplete رویداد

شده باشد .

زمانی رخ می دهد که کنترل شروع به ارسال : SendProgress رویداد

داده نماید . شکل کلی آن بصورت زیر است :

,WinSock_SendProgress (bytesSent As Long

bytesRemaining As Long)x

١۶۵

تعداد bytesRemaining تعداد بایتهای ارسال شده و bytesSent که

بایتهای باقیمانده است

بخش اول - Windows Packet Capture آشنایی با کتابخانه

مقدمه :

TCP/IP به بحث مروری بر TCP/IP برای آشنایی با مبانی شبکه های

مراجعه کنید .

معرفی :

و TCP/IP های Packet یک معماری برای استخراج WinPcap کتابخانه

آنالیز شبکه در محیطهای 32 بیتی ویندوز می باشد . این کتابخانه شامل

سه بخش است :

( Kernel ) در سطح هسته سیستم عامل Packet 1 - یک فیلتر

packet.dll با نام ( low-level ) سطح پایین dll 2 - یک کتابخانه

با نام ( high-level ) 3 - یک کتابخانه مستقل از سیستم عامل و سطح بالا

wpcap.dll

است که به ( device driver ) یک درایور دستگاه packet فیلتر

١۶۶

capture و 2000 قابلیت استخراج و NT ،ME ، 98 ، ویندوزهای 95

از یک کارت شبکه را می دهد . ( raw data ) کردن و نیز ارسال داده خام

شده را در یک بافر capture های packet همچنین این امکان را دارد که

ذخیره کند و یا آنها را فیلتر نماید .

است که بمنظور دسترسی مستقیم به عملکرد API یک packet.dll

یک واسط برنامه packet.dll استفاده می شود . بنابراین packet درایور

نویسی مستقل از سیستم عامل های مایکروسافت را مهیا می کند .

را capture مجموعه ای از ابزارهای سطح بالای اصلی برای Wpcap.dll

در capture کتابخانه ) libpcap مهیا می کند که این توابع با کتابخانه

کردن capture سازگار می باشند . این توابع اجازه ( UNIX سیستم عامل

ها را با روشی مستقل از سخت افزار شبکه و مستقل از سیستم packet

عامل مهیا می کنند .

: WinPcap دریافت کتابخانه

: WinPcap نسخه 2.2

های مربوطه DLL شامل درایور و ) auto-installer برای دریافت برنامه

به آدرس زیر Windows 95/98/ME/NT/ ) برای سیستم های 2000

مراجعه کنید :

(auto-installer (driver +DLLs WinPcap

برای دریافت بسته توسعه دهنده این کتابخانه که شامل برنامه های نمونه

libpcap و packet.dll و packet capture driver ایجاد شده توسط

است ، به آدرس زیر مراجعه کنید :

pack Developer's

به آدرس زیر مراجعه WinPcap کتابخانه source code برای دریافت

١۶٧

کنید :

source code WinPcap

بخش دوم - Windows Packet Capture آشنایی با کتابخانه

: WinPcap پاسخ به سوالاتی در مورد کتابخانه

چگونه روی سیستم نصب می شود ؟ WinPcap - 1

های مربوطه در Dll در صورت اجرای فایل نصب ، فایل درایور و

Control Panel دایرکتوری سیستم شما کپی می شوند . همچنین در

را WinPcap می توانید عبارت Add/Remove Program بخش

مشاهده کنید .

است ؟ WinPcap آخرین نسخه WinPcap 2 - آیا 2.2

نسخه 2,3 می باشد که از آدرس زیر قابل WinPcap خیر . آخرین نسخه

دریافت است :

Support Windows 95/98/ME/NT/2000/XP

auto-installer:driver +DLLs WinPcap

pack Developer's

code WinPcap source

را می توانید از آدرس زیر دریافت کنید WinPcap 3.0 Alpha همچنین 4

:

auto-installer:driver +DLLs WinPcap

در حال اجرا روی یک کامپیوتر WinPcap 3 - چگونه می توان فهمید که

است ؟ Win2k/XP

را وارد کنید . سپس در بخش msinfo دستور 32 Run در بخش

١۶٨

بایستی System Drivers و سپس بخش Software Environment

را ببینید . NPF عبارت

که بعدا در مورد Windump مثل ) WinPcap 4 - برنامه های بر مبنای

WinPcap آن صحبت خواهم کرد ) بدرستی اجرا نمی شوند . آیا اشکال از

است ؟

لیست windump -D را نصب کنید . دستور Windump برنامه

آداپتورهای مجاز را گزارش می دهد و همچنین نشان می دهد که آیا

قادر به شناسایی درست سخت افزار شما بوده است یا نه . اگر WinPcap

. WinPcap درست کار کند ، اشکال از برنامه شماست نه از Windump

اتصالات مودمی ) ) PPP در اتصالات WinPcap 5 - آیا می توان از

استفاده کرد ؟

گاهی اوقات WinPcap است NDIS در ویندوز 95 بخاطر باگی که در

این مشکل وجود ME می کند . در ویندوزهای 98 و reset را PPP اتصال

نیست . در ویندوزهای packet ندارد اما گاهی اوقات قادر به ارسال

وجود دارد که مانع از binding نیز برخی مشکلات در فرایند NT/2k/XP

می شود . این مشکل WAN درست کار کردن درایور پروتکل روی آداپتور

است که یک واسط استاندارد را برای ndiswan با نام PPP بخاطر درایور

کردن مهیا نمی کند . capture

چگونه است ؟ WinPcap در Security - 6

این برنامه ضعیف است و نویسندگان این برنامه درحال Security مدل

کار روی آن هستند .

١۶٩

Borland می توان در محیطهای برنامه نویسی WinPcap 7 - آیا از

استفاده کرد ؟

استفاده کرد C++ Builder در WinPcap برای اینکه بتوان از امکانات

Borland که در دایرکتوری COFF2OMF.EXE بایستی توسط برنامه

که بر اساس wpcap.lib و Packet.lib وجود دارد ، کتابخانه های

هستند را به استاندارد ( COFF استانداردهای مایکروسافت ( استاندارد

COFF2OMF input.lib output.lib : تبدیل کنید مثال OMF

در ویژوال بیسیک استفاده کرد ؟ WinPcap 8 - آیا می توان از

استفاده کرد . شرکت VB بطور مستقیم نمی توان از این کتابخانه در

ایجاد کرده که بوسیله آن PacketX با نام ActiveX یک کنترل BeeSync

در ویژوال بیسک یا هر محیط دیگری WinPcap می توان از تواناییهای

را پشتیبانی کند استفاده کرد . Microsoft ActiveX technology که

موضوع بخش بعدی این سلسه مقالات می ActiveX بحث در مورد این

باشد .

می تواند با فایروال کار می کند ؟ WinPcap 9 - آیا

ممکنست گاهی اوقات کار نکند .

در جاوا استفاده کرد ؟ WinPcap 10 - آیا می توان از

بطور مستقیم از جاوا پشتیبانی نمی کند اما در این آدرس می WinPcap

را برای اینکار دریافت کنید . Java wrapper توانید یک

پشتیبانی می کند ؟ loopback های device از WinPcap 11 - آیا

١٧٠

خیر و علت آن بخاطر محدودیتهای ویندوز است .

از چه سخت افزارهایی پشتیبانی می کند ؟ WinPcap - 12

طوری توسعه یافته که بتواند با آداپتورهای اترنت driver NPF device

مودمها ) PPP WAN درست کار کند اما نمی تواند بدرستی با آداپتورهای

و FDDI, ARCNET, ATM ) کار کند . همچنین نبایستی با کارتهای

مشکلی داشته باشد اما این امر بطور قطعی تائید شده Token Ring

نیز نمی تواند درست کار کند و در Wireless نیست . با آداپتورهای

را ببیند . Ethernet emulation بهترین حالت قادرست یک

بسته های اطلاعاتی ورودی را ، WinPcap 13 - آیا می توان توسط

کرد ؟ Drop

کرد . capture خیر فقط می توان بسته ها را

ساخت ؟ Firewall یک WinPcap 14 - آیا می توان توسط امکانات

کردن بسته ها را Drop قابلیت WinPcap همانطور که در بالا گقته شد

sniff تنها روی بسته های WinPcap در Filtering ندارد و تواناییهای

TCP/IP شده است . برای جلوگیری کردن از ورود یک بسته به پشته

بایستی خودتان یک درایور میانی ایجاد کنید .

بطور اتوماتیک در زمان WinPcap 15 - چگونه می توان کاری کرد که

بوت سیستم فعال گردد ؟

تغییر دهید . این کار فقط در x به 20 x مقدار کلید زیر را در رجیستری از 30

جواب می دهد : NTx ویندوزهای

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\

Services\NPF\Start

١٧١

نتیجه درستی حاصل می WinPcap 16 - آیا با کامپایل مجدد سورس

شود ؟

Microsoft Visual برنامه Service Pack بله اما ابتدا بایستی 5

را از سایت مایکروسافت دریافت و آنرا نصب کنید . Studio

های packet برای کار با WinPcap 17 - آیا درایورهای دیگری بجز

وجود دارد ؟ TCP/IP

packet کردن capture یک کتابخانه Zx Sniffer بله . برای مثال برنامه

است . WinPcap دارد که مشابه

Packet های کاملی برای کار با Tutorial ها و Document 18 - آیا

در ویژوال سی وجود دارد ؟ wpcap.dll و Packet.dll و Driver API

بله . برای اینکار می توانید از مطالب زیر استفاده کنید :

How to use wpcap.dll

specific extensions wpcap

low level capture library Packet Driver API. How to use the

of how to write and compile a Instructions and examples

driver's capture application using libpcap calls or packet

(PACKET.DLL) calls

Compiling WinPcap

بخش سوم - Windows Packet Capture آشنایی با کتابخانه

معرفی : WinPcap بررسی یکی از برنامه های نوشته شده با

WinDump

مقدمه :

١٧٢

می TcpDump نسخه تحت ویندوز برنامه مشهور WinDump برنامه

وجود دارد . این برنامه یکی از بهترین UNIX باشد که در سیستم عامل

می باشد . Network Sniffer/Analyzer ابزارهای

سازگار می باشد و می توان از آن برای TcpDump کاملا با WinDump

مانیتور کردن ترافیک شبکه بر اساس قوانین مختلف و پیچیده ای که قابل

تنظیم هستند ، استفاده کرد .

قابل NT/2000/XP و نیز ME/98/ روی سیستم عاملهای 95 WinDump

استفاده می باشد .

استفاده می کند . WinPcap موجود در libpcap از کتابخانه WinDump

دریافت برنامه :

برای دریافت نسخه 3,6,2 به آدرس زیر مراجعه کنید :

WinDump.exe

source code WinDump

را روی WinPcap نکته : قبل از اجرای این برنامه بایستی برنامه 2,3

سیستم خود نصب کنید .

به آدرس زیر مراجعه کنید : alpha برای دریافت نسخه 3,8

WinDump.exe

code WinDump source

را روی WinPcap نکته : قبل از اجرای این برنامه بایستی برنامه 3,0

سیستم خود نصب کنید .

: WinDump پاسخ به سوالاتی در مورد برنامه

١٧٣

لیست آداپتورهای شبکه را WinDump 1 - چگونه می توان با استفاده از

بدست آورد ؟

WinDump –D با اجرای دستور

را WinDump می توان WinDump –i adaptername توسط دستور

روی آداپتور خاصی اجرا کرد .

اتصالات مودمی ) ) PPP روی اتصالات WinDump 2 - آیا می توان از

استفاده کرد ؟

می WinPcap هایی پشتیبانی می کند که device از همان WinDump

کند . به بخش قبل مراجعه کنید .

بدست آورد ؟ TcpDump 3 - چگونه می توان اطلاعاتی در مورد

چرا این برنامه قادر ، WinDump 4 - با وجود نصب آخرین نسخه برنامه

ها نیست ؟ packet کردن همه capture به

می توانید سایز بافر درایور را افزایش دهید برای مثال B توسط سوئیچ

سایز بافر را 5 مگابایت می کند . سایز بافر Windump –B دستور 5000

برنامه در حالت عادی 1 مگابایت است .

را روی یک ماشین اجرا کرد ؟ WinDump 5 - آیا می توان چندین

بله

می کند ؟ hang کردن برای مدتی capture در زمان WinDump 6 - چرا

١٧۴

در برنامه می باشد که برای gethostbyaddr علت آن فراخوانی تابع

از -n ها بکار می رود . می توان توسط سوئیچ name host استخراج

جلوگیری کرد . name resolution

وجود دارد ؟ WinDump 7 - آیا اطلاعات کاملی در مورد برنامه

به آدرس زیر مراجعه کنید :

Manual WinDump

PacketX آشنایی با

مقدمه

مجموعه ای از کلاسهای اکتیو ایکس است که امکانات PacketX

را در ویژوال بیسیک و هر زبان برنامه نویسی دیگری که از WinPcap

پشتیبانی کند مهیا می کند . ActiveX Microsoft تکنولوژی

کردن و فیلتر capture برای WinPcap از PacketX بطور خلاصه

استاندارد capture های شبکه استفاده می کند . علاوه بر packet کردن

برای گردآوری اطلاعات ترافیک شبکه و PacketX ، شما می توانید از

استفاده کنید . raw packet ارسال

PacketX دریافت

برای دریافت نسخه 1,3 این کتابخانه به آدرس زیر مراجعه کنید :

PacketX 1.3 Download

را که آدرس آن در WinPcap بایستی 2.3 PacketX قبل از استفاده از

١٧۵

بخش قبل گفته شد دریافت و نصب نمائید .

PacketX استفاده از

با یک مثال ساده سعی می کنم روش استفاده از این کتابخانه را به شما

آموزش دهم .

وارد محیط ویژوال بیسیک شده و از منوی PacketX پس از نصب

را انتخاب کنید . Components مورد Project

ToolBar را انتخاب کنید تا به Library PacketX Type سپس مورد

اضافه شود .

١٧۶

آن properties را در فرمتان قرار دهید و سپس در قسمت ActiveX این

کلیک نموده و نوع آداپتور را مشخص نمائید . Custom روی

می توانید اطلاعاتی از Edit پس از انتخاب آداپتور با کلیک روی دکمه

قبیل مد کاری و سایر بافر و نوع فیلترینگ را مشخص نمائید .

١٧٧

می گذاریم . PacketX نام این شی را نیز 1

قرار دهید . همچنین یک Stop و Start در فرمتان دو دکمه به نامهای

در فرمتان قرار دهید . IPList با نام listBox

عبارت زیر را بنویسید : Form_load در کد مربوط به

PacketX1.Adapter.BPFilter = "port 80"x

های پورت 80 را packet عبارت فوق مشخص می کند که می خواهیم

کنیم . capture

بنویسید : Start مربوط به کلیک شدن دکمه event کد زیر را برای

PacketX1.start

بنویسید : PacketX مربوط به 1 OnPacket کد زیر را برای متد

Private Sub PacketX1_OnPacket(ByVal pPacket As

PACKETXLibCtl.IPktXPacket)x

IPList.AddItem (pPacket.DestIpAddress)x

Sub End

ها را به یک لیست اضافه می کند . شما packet مقصد IP کد فوق آدرس

سایز داده ، ، packet می توانید اطلاعات دیگری از قبیل داده موجود در

آدرس مبدا ، تاریخ ارسال داده و غیره را استخراج کنید .

بنویسید : Stop مربوط به کلیک شدن دکمه event کد زیر را برای

PacketX1.stop

١٧٨

packet برای اینکه بتوانید در یک مدت خاص وضعیت دریافت و ارسال

را بدست آورید باید ابتدا توسط دستور زیر مد آداپتور را در حالت

قرار دهید : Statistic

PacketX1.Adapter.Mode=PktXModeStatistics

sec 2 //' PacketX1.Adapter.ReadTimeout=2000

اطلاعات OnStatistics نموده و توسط متد start را PacketX سپس 1

مربوطه را استخراج کنید .

و ماژولهای آن به PacketX برای مشاهده اطلاعات کامل در مورد ساختار

آدرس زیر مراجعه کنید :

Documentation PacketX

XML ایجاد کلاسی برای کار با فایلهای

XML ایجاد کلاسی برای کار با فایلهای

مقدمه :

همانطور که در قسمت سوم مباحث برنامه نویسی اکتیوایکس های

سرور ساید گفته شد برای قرار دادن پارامترهای اتصال به بانک

استفاده خواهیم نمود . بنابراین ابتدا بایستی XML اطلاعاتی از فایل

١٧٩

بنویسیم . توجه داشته باشید که XML کلاسی برای کار با فایلهای

کلاسی که در این بخش معرفی می شود کلاسی ساده می باشد که فقط با

را خواند . در صورت xml وجود در فایل Node آن می توان مقدار یک ند

نیاز ، می توانید خودتان متدهای دیگری را به آن اضافه کنید . برای این

منظور نکاتی را در انتهای همین بخش آورده ام .

eXtensible Markup ) یک زبان نشانه ای توسعه پذیر XML

است که در سال 1998 توسط کنسرسیوم وب جهانی ( Language

واقعا یک زبان نیست بلکه یک متا-زبان است و XML . ایجاد شد W3C

XML برای توصیف سایر زبانها بکار می رود . داده ها در فایلهای

براحتی قابل تعریف و استفاده هستند .

: XML مثالی از یک فایل

<user>

<name/>ali<name>

<id/>12<id>

<user/>

در وی بی : XML کار با فایلهای

در ویژوال بیسیک بایستی ابتدا از بخش xml برای کار با فایلهای

را انتخاب کنید . سپس یک Microsoft XML مورد 3.0 References

XMLReader به پروژه تان اضافه کنید و نام آنرا Modules Class

برای کار با xml بگذارید . در این کلاس ابتدا یک متغیر از نوع شی

تعریف می کنیم : xml فایلهای

Private xml

١٨٠

می نویسیم . این متد دارای xml سپس متدی برای مقداردهی اولیه شی

مورد نظر می باشد : xml یک متغیر ورودی است که نام فایل

String)x Public Sub Initiate(ByVal filename As

Set xml = CreateObject("Microsoft.XMLDOM")x

xml.async = False

xml.Load (server.MapPath(filename))x

End Sub

برای یافتن مسیر فیزیکی فایل server توجه کنید که در کد فوق از شی

Class_Initialize استفاده شده است بنابراین ابتدا بایستی در XML

این شی را مطابق مطالب درس دوم مقداردهی کنید .

بنویسیم . در xml حال بایستی متدی برای خواندن مقدار یک ند از فایل

ندهای فایل را بررسی می کنیم تا for each این متد توسط یک حلقه

ندی را بیابیم که نامش مشابه با متغیر ورودی متد است . سپس با

می توانیم مقدار آنرا بخوانیم . nodeValue استفاده از خاصیت

Public Function getvalue(ByVal NName As String) As

String

Dim x

getvalue = ""x

xml.documentElement.childNodes For Each x In

If x.nodeName = NName Then

x.childNodes(0).nodeValue = getvalue

Exit For

End If

Next

Function End

 

 

١٨١

: XMLReader مثالی از کار با کلاس

همانطور که گفته شد می توانیم پارامترهای اتصال به بانک اطلاعاتی را

برای ADODB کردن Initiate قرار دهیم و در زمان XML در فایل

اتصال به بانک اطلاعاتی ، آنها را بخوانیم :

Dim xmlf As New XMLReader

xmlf.Initiate("config.xml")x Call

xmlf.getvalue("DataBaseID")x = userName

xmlf.getvalue("DataBasePassword")x = Password

xmlf.getvalue("DataBaseName")x = database_name

xmlf.getvalue("ServerAddress")x = server_name

بصورت زیر می باشد : config.xml ساختار یک فایل نمونه

<Application/>testIt<Application>

<ServerAddress/>192,168,0,1<ServerAddress>

<DataBaseName/>Edatabase<DataBaseName>

<DataBaseID/>Euser<DataBaseID>

<DataBasePassword/>Epass<DataBasePassword>

سایر نکات برای توسعه کلاس فوق :

نکات زیر شما را در نوشتن کلاسی کاملتر راهنمایی می کنند :

بعنوان ریشه xml.documentElement 1 - توجه داشته باشید که

 

 

١٨٢

محسوب می شود . بنابراین برای دسترسی به ریشه می توان xml فایل

یک شی ریشه نیز تعریف کرد :

Dim root

Set root = xml.documentElement

دارای چندین ند در ریشه اش باشد و هر xml 2 - در صورتیکه یک فایل

ند ریشه نیز دارای چندین ند درونی باشد توسط خاصیت

می توان به این for و با استفاده از یک حلقه root.childNodes.length

ندها دسترسی داشت . برای مثال فایل زیر را درنظر بگیرید :

<people>

<user>

<name/>ali<name>

<id/>1<id>

<user/>

<user>

<name/>reza<name>

<id/>2<id>

<user/>

<people/>

حلقه زیر روش دسترسی را به این فایل نشنان می دهد :

For I = 0 TO (root.childNodes.length - 1)x

thisChild = root.childNodes(I)x Set

name = thisChild.childNodes(0).Text

١٨٣

thisChild.childNodes(1).Text = id

Next

3 – اضافه کردن ند به فایل : برای اضافه کردن ند از متدهای

استفاده می شود برای مثال برای appendChild و createNode

جدید به مثال فوق : user اضافه کردن یک

x("" ,"Set newuser = xml.createNode("element", "people

Dim name,id

x("" ,"Set newname = xml.createNode("element", "name

newname.text = yourname

x("" ,"Set newid = xml.createNode("element", "id

yourid = newid.text

newuser.appendChild(newname)x

newuser.appendChild(newid)x

root.appendChild(newuser)x

در انتها نیز بایستی فایل را ذخیره نمود :

xml.save(Server.Mappath(filename))x

for 4 – حذف یک ند از فایل : برای حذف یک ند از فایل توسط یک حلقه

آنرا removeChild بایستی ند مورد نظر را یافته و سپس توسط متد

حذف کنیم :

found = False

TO 0 STEP -1 (1 - For I = (root.childNodes.length

Set thisChild = root.childNodes(I)x

 

 

١٨۴

thisChild.childNodes(0).Text = name

If name = searchname Then

root.removeChild(thisChild)x

found = True

End If

Next

را ذخیره کنید . xml در انتها نیز فایل

BitBlt آشنایی با

BitBlt آشنایی با

و برخی دیگر از BitBlt هدف از این مبحث آموزشی ، آشنایی با تابع

برای انجام برخی عملیات گرافیکی مثل Win32 GDI توابع کتابخانه

از فایل است . sprite و خواندن double buffering

به کاراکترهای متحرکی گفته می شود که در بازیها وجود sprite : نکته

دارد .

اولین چیزی که به آن نیاز دارید ایجاد یک فرم است . خاصیت

قرار دهید . پیشنهاد می کنم که همیشه Pixel- آنرا برابر 3 ScaleMode

scalemode برای pixel از API در هنگام استفاده از فرم بهمراه

استفاده کنید .

برابر 320 ScaleWidth سپس سایز فرم را به اندازه ای افزایش دهید تا

فرم HasDC برابر 256 شود . توجه کنید که خاصیت ScaleHeight و

برای فرم AutoRedraw قرار دهید . همچنین از خاصیت True را

١٨۵

استفاده Double Buffering استفاده نمی کنیم زیرا می خواهیم از

کنیم که بسیار سریعتر و کارامدتر می باشد .

هایی است که به آنها نیاز داریم : API کردن declare مرحله بعدی

blitting'

gdi32" (ByVal " Private Declare Function BitBlt Lib

hDestDC As Long, ByVal x As Long, ByVal y As Long,

As Long, ByVal nHeight As Long, ByVal ByVal nWidth

ySrc As hSrcDC As Long, ByVal xSrc As Long, ByVal

Long, ByVal dwRop As Long) As Long

code timer'

Function GetTickCount Lib "kernel32" () Private Declare

As Long

sprites creating buffers / loading'

Private Declare Function CreateCompatibleBitmap Lib

hdc As Long, ByVal nWidth As Long, "gdi32" (ByVal

ByVal nHeight As Long) As Long

Declare Function CreateCompatibleDC Lib Private

Long "gdi32" (ByVal hdc As Long) As

Private Declare Function GetDC Lib "user32" (ByVal

Long hwnd As Long) As

loading sprites'

ByVal ) "Private Declare Function SelectObject Lib "gdi32

hdc As Long, ByVal hObject As Long) As Long

cleanup'

Declare Function DeleteObject Lib "gdi32" (ByVal Private

Long hObject As Long) As

Private Declare Function DeleteDC Lib "gdi32" (ByVal

Long hdc As Long) As

hDC ،Device Context و یا بعبارت دیگر DC ؟ چیست DC : سوال

یک عدد است که به یک آدرس در حافظه اشاره می کند که داده ای در آن

برای اشاره کردن به BitBlt ذخیره شده است . در هنگام استفاده از

 

 

١٨۶

آدرسی که داده گرافیکی در آنجا ذخیره شده ، استفاده می شود .

داریم که می سازیم . DC در مرحله بعدی نیاز به ذخیره آدرسهای

Public هستند همچنین آنها را بصورت Long مقادیر DC آدرسهای

تعریف می کنیم :

our Buffer's DC'

Long Public myBackBuffer As

Public myBufferBMP As Long

The DC of our sprite/graphic'

mySprite As Long Public

coordinates of our sprite/graphic on the screen'

SpriteX As Long Public

Public SpriteY As Long

کند . load حال باید تابعی بسازیم که تصاویر گرافیکی درون حافظه

device context نکته مهمی که باید به آن توجه کنید اینست که یک

bitmap خودش به تنهایی هیچ داده گرافیکی ندارد و بایستی یک

یا یک bmp شود برای مثال یک فایل load موجود باشد تا درون آن

استفاده می کنید . back buffer خالی که از آن بعنوان bitmap

منطبق با صفحه می device context تابعی که خواهیم نوشت یک

قرار device context سازد سپس فایلهای گرافیکی مورد نظر را درون

می دهد :

As (Public Function LoadGraphicDC(sFileName As String

Long

temp variable to hold our DC address'

Long Dim LoadGraphicDCTEMP As

create the DC address compatible with'

screen the DC of the'

LoadGraphicDCTEMP =

 

 

١٨٧

((CreateCompatibleDC(GetDC(0

...file into the DC load the graphic'

,SelectObject LoadGraphicDCTEMP

(LoadPicture(sFileName

return the address of the file'

LoadGraphicDCTEMP = LoadGraphicDC

End Function

چیست ؟ زمانیکه یک محیط گرافیکی می double-buffering : سوال

ها / گرافیکها / متن sprite سازید تا درون آن چیزی را ترسیم کنید ، شما

سپس نتیجه نهایی را روی ( offscrean ) می کنید blit را درون حافظه

جلوگیری flickering می کنید . این عمل از لرزش تصویر یا blit صفحه

blit مستقیماً روی صفحه sprite می کند ( زمانی رخ می دهد که چندین

است . AutoRedraw شوند ) و بسیار سریعتر از

را توضیح خواهم BitBlt قبل از اینکه مثالی برای این تابع ذکر کنم تابع

داد :

bit- است . این تابع یک انتقال ”dll “gdi تابعی از کتابخانه 32 BitBlt

device از داده های مرتبط به یک مستطیل از پیکسلها به یک block

مقصد انجام می دهد . بعبارت دیگر داده های گرافیکی را از context

یا یک screen ) به محیط گرافیکی دیگری ( bitmap محیط گرافیکی ( یک

کپی می کند . فرم کلی این تابع بصورت زیر است : ( form

_ "Declare Function BitBlt Lib "gdi32" Alias "BitBlt

_ ,ByVal hDestDC As Long)

_ ,ByVal x As Long

_ ,ByVal y As Long

١٨٨

_ ,ByVal nWidth As Long

_ ,ByVal nHeight As Long

_ ,Long ByVal hSrcDC As

_ ,ByVal xSrc As Long

_ ,ByVal ySrc As Long

Long) As Long ByVal dwRop As

BitBlt به تابع gdi32 DLL اولین خط بیان می کند که ما بوسیله

دسترسی خواهیم داشت . خطوط دیگر پارامترهایی هستند که این تابع

می گیرد :

مربوط به محیط مقصد ( اگر می خواهید مقصد یک hDestDC : hDC

استفاده کنید و یا اینکه آدرس یک form.hDC فرم باشد از

را که ساخته اید بدهید ) backbuffer

مختصات افقی محلی که می خواهید گرافیک شما ظاهر شود . : x

مختصات عمدی محلی که می خواهید گرافیک شما ظاهر شود . : y

عرض گرافیک شما : nWidth

ارتفاع گرافیک شما : nHeight

مربوط به محیط مبدا hSrcDC : hDC

زمانی استفاده می شود که بخواهید از سمت چپترین x . افست 0 : xSrc

را انجام دهید . blit گوشه گرافیک مبدا عمل

y افست : ySrc

گرافیکتان می خواهید blitting ای که در زمان draw مد : dwRop

این پارامتر مقادیر زیر . ( ROP یا Raster Operations ) استفاده کنید

را می تواند بگیرد :

داده تصویر مبدا را مستقیماً در مقصد کپی می کند . : vbSrcCopy -

 

 

١٨٩

می کند ( OR داده های تصاویر مبدا و مقصد را با هم : vbSrcPaint -

( pseudo-alphablending effect

می کند ( AND داده های تصاویر مبدا و مقصد را با هم : vbSrcAnd -

( pseudo-gamma effect

می XOR داده های تصاویر مبدا و مقصد را با هم : vbSrcInvert -

کند

می کند سپس آنرا invert ابتدا داده تصویر مقصد را : vbSrcErase -

می کند . AND با داده تصویر مبدا

می کند و داده تصویر invert داده تصویر مقصد را : vbDstInvert -

مبدا را در نظر نمی گیرد .

می کند و آنرا مستقیما invert داده تصویر مبدا را : vbNotSrcCopy -

در مقصد کپی می کند .

کرده و نتیجه OR داده تصاویر مبدا و مقصد را : vbNotSrcErase -

می کند . invert را

: BitBlt مثالی از کاربرد

,BitBlt Form1.hDC, PlayerX, PlayerY, 48, 48

picPlayer.hDC, 0, 0, vbSrcCopy

را در image در یک حلقه استفاده کنیم تا یک BitBlt حال می خواهیم از

فرم حرکت دهیم :

در sprite1.bmp بسازید و با نام x با ابعاد 3232 bmp 1 – یک فایل

دایرکتوری پروژه ذخیره کنید .

بگذارید . cmdTest 2 – یک دکمه در فرم قرار دهید و نام آنرا

3 – دکمه را در گوشه بالایی فرم و در سمت راست قرار دهید .

مربوط به کلیک شدن دکمه بنویسید : event 4 – کد زیر را برای

١٩٠

...Timer variables'

Long Dim T1 As Long, T2 As

’backbuffer برای DC ساخت

((CreateCompatibleDC(GetDC(0 = myBackBuffer

’DC برای bitmap ساخت یک سطح

CreateCompatibleBitmap(GetDC(0), 320, = myBufferBMP

(256

’buffer خالی درون bitmap کردن سطح load

SelectObject myBackBuffer, myBufferBMP

پر کنیم’ black کردن درون بافر باید آنرا با blit قبل از

vbWhiteness ,BitBlt myBackBuffer, 0, 0, 320, 256, 0, 0, 0

توسط تابعی که در بالا نوشتیم’ split کردن load

("sprite1.bmp\" & LoadGraphicDC(App.Path = mySprite

cmdTest.Enabled = False

== شروع حلقه اصلی ==’

جاری’ tickcount خواندن

GetTickCount = T2

Do

DoEvents

T1 = GetTickCount

اگر 15 میلی ثانیه گذشته بود فریم بعدی شروع شود

Then 15 =< (If (T1 - T2

‘ black بوسیله پر کردن آنجا با sprite پاک کردن محل قبلی

SpriteY - 1,32, 32, 0, 0, ,BitBlt myBackBuffer, SpriteX - 1

0, vbBlackness

’buffer back درون sprite کردن Blit

BitBlt myBackBuffer, SpriteX, SpriteY, 32, 32,mySprite, 0,

vbSrcPaint ,0

 

 

١٩١

روی فرم’ backbuffer کردن Blit

myBackBuffer,0, 0, ,BitBlt Me.hdc, 0, 0, 320, 256

vbSrcCopy

روی صفحه’ sprite حرکت دادن

1 + SpriteX = SpriteX

SpriteY = SpriteY + 1

update timer'

T2 = GetTickCount

If End

Loop Until SpriteX = 320

بنویسید تا حافظه های را که برای cleanup code سپس باید یک

ها استفاده کرده اید آزاد کنید : buffer نگهداری تصاویر گرافیکی و

(Private Sub Form_Unload(Cancel As Integer

DeleteObject myBufferBMP

DeleteDC myBackBuffer

mySprite DeleteDC

End

End Sub

در متحرک سازی Masking آشنایی با تکنیک

حتماً بازیهای دوبعدی را دیده اید که یک کاراکتر متحرک توسط شما

روی یک زمینه تصویری حرکت داده می شود . تکنیکی که برای قراردادن

نام Masking یک کاراکتر متحرک روی یک زمینه ثابت استفاده می شود

عبارت است از حذف بخشهایی از کاراکتر متحرک که Masking . دارد

نمی خواهیم نشان داده شوند و قرار دادن کاراکتر روی یک زمینه

تصویری . برای آشنایی بیشتر با این تکنیک دو تصویر زیر را مشاهده

کنید :

١٩٢

می خواهیم کاراکتر یک هواپیما را روی زمینه تصویری حرکت دهیم .

برای کاراکتر هواپیما داریم : Mask برای اینکار نیاز به دو

اول بدین صورت ساخته می شود که نقاطی از کاراکتر را که Mask – 1

می خواهیم روی زمینه ظاهر شوند را به رنگ سیاه و سایر نقاط را به

رنگ سفید در می آوریم :

دوم معکوس ماسک اول است یعنی نقاطی از کاراکتر را که Mask – 2

می خواهیم روی زمینه ظاهر شوند را به رنگ سفید و سایر نقاط را به

رنگ سیاه در می آوریم :

١٩٣

حال برای قرار دادن کاراکتر روی زمینه باید مراحل زیر انجام شود :

MergePaint 1 – قرار دادن ماسک اول روی زمینه با استفاده از

MergePaint 2 – قرار دادن ماسک دوم روی کاراکتر با استفاده از

3 – قرار دادن نتیجه مرحله اول روی نتیجه مرحله دوم با استفاده از

And

مراحل برنامه نویسی :

1 - تعریف بافرهای مورد نیاز :

buffer1 = CreateCompatibleDC(GetDC(0))x

CreateCompatibleBitmap(GetDC(0), 50, 45)x = mybuffer1

CreateCompatibleDC(GetDC(0))x = buffer2

,320 ,(mybuffer2 = CreateCompatibleBitmap(GetDC(0

x(256

buffer3 = CreateCompatibleDC(GetDC(0))x

CreateCompatibleBitmap(GetDC(0), 320, = mybuffer3

256)x

mybuffer1 ,SelectObject buffer1

SelectObject buffer2, mybuffer2

mybuffer3 ,SelectObject buffer3

buffer است . 1 x و ابعاد کاراکتر هواپیما 4550 x ابعاد زمینه 256320

buffer برای ذخیره کاراکتر و انجام عملیات شماره 2 بکار می رود . 2

برای انجام عملیاتهای 1 و buffer برای نگهداری زمینه بکار می رود و 3

١٩۴

3 بکار می رود .

کردن تصاویر مورد نیاز : Load - 2

& mySprite = LoadGraphicDC(App.Path

sprite1.bmp")x\"

& myMask1 = LoadGraphicDC(App.Path

mask1.bmp")x\"

& myMask2 = LoadGraphicDC(App.Path

mask2.bmp")x\"

فرم شما می باشد پس ابتدا باید به فرمتان یک Picture زمینه تصویر

بدهید . background را بعنوان picture

: buffer 3 – ذخیره زمینه در 2

vbSrcCopy ,BitBlt buffer2, 0, 0, 320, 256, Form1.hdc, 0, 0

: Masking 4 – شروع حلقه متحرک سازی و انجام

Do

DoEvents

قرار دادن زمینه در یک بافر کمکی

BitBlt buffer3, 0, 0, 320, 256, buffer2, 0, 0, vbSrcCopy

کردن ماسک اول با بافر کمکی زمینه’ Merge

myMask1, 0, 0, ,BitBlt buffer3, SpriteX, SpriteY, 50, 45

vbMergePaint

قرار دادن کاراکتر در یک بافر کمکی

buffer1, 0, 0, 50, 45, mySprite, 0, 0, vbSrcCopy BitBlt

١٩۵

کردن ماسک دوم با بافر کمکی کاراکتر’ Merge

vbMergePaint ,BitBlt buffer1, 0, 0, 50, 45, myMask2, 0, 0

کردن بافرهای کمکی با هم’ And

SpriteY, 50, 45, buffer1, 0, 0, ,BitBlt buffer3, SpriteX

vbSrcAnd

قرار دادن نتیجه نهای روی فرم

BitBlt Form1.hdc, 0, 0, 320, 256, buffer3, 0, 0, vbSrcCopy

SpriteX + 1 = SpriteX

SpriteY = SpriteY + 1

Loop Until SpriteX = 320

در ویژوال بیسیک OpenGL راهنمای برنامه نویسی

برای ساخت برنامه های گرافیکی می low-level یک کتابخانه OpenGL

پیاده سازی شده است . دو ورژن dll باشد که این کتابخانه در دو فایل

. SGI و نسخه Microsoft مختلف از این کتابخانه وجود دارد : نسخه

١٩۶

و opengl32.dll به نامهای dll دارای دو فایل Microsoft نسخه

و opengl.dll دارای دو فایل به نامهای SGI است و نسخه glu32.dll

می باشد . glu.dll

در ویژوال بیسیک تنها چیزی که لازمست OpenGL برای استفاده از

نصب یک کتابخانه نمونه می باشد :

VBOpenGL 1.2 for Microsoft

VBOpenGL 1.2 for SGI

استفاده کنید . " SGI و هم MS شما می توانید هم از نسخه

Visual Programming OpenGL with اطلاعات فوق را من از سایت

برایتان ترجمه کرده ام Basic

Collision Detection الگوریتم

Collision Detection الگوریتم

Masking و آشنایی با تکنیک BitBlt نکته : اگر مباحث آشنایی با تابع

را مطالعه نکرده اید ، پیشنهاد می کنم ابتدا آنها را مطالعه کنید .

sprite تکنیک تشخیص برخورد دو ، collision detection تکنیک

متحرک در صفحه می باشد . این تکنیک برای ساخت بازیهای کامپیوتری

بسیار استفاده می شود و الگوریتمهای زیادی برای تشخیص برخورد دو

بعدی و سه بعدی وجود دارد . در این بخش من شما را با چند تکنیک

تشخیص برخورد دوبعدی آشنا خواهم کرد :

١٩٧

bounding یکی از ساده ترین الگوریمتهای تشخیص برخورد ، الگوریتم

bounding یا sprite می باشد . در این الگوریتم مرزهای دو box

چک می شوند تا برخورد تشخیص داده شود . rectangles

bounding یکی دیگر از الگوریتمهای تشخیص برخورد ، الگوریتم

با هم sprite است . در این الگوریتم دایره های محیطی دو sphere

مقایسه می شوند .

اما یکی از بهترین الگوریتم های تشخیص برخورد دو بعدی الگوریتمی

را با هم مقایسه می کند و در sprite است که ابتدا مستطیل محیطی دو

صورت وجود تداخل دو مستطیل ، به سراغ چک کردن تداخل در سطح

می رود . برای بررسی تداخل در سطح پیکسل از sprite پیکسلهای دو

استفاده می شود . sprite های دو mask

قبل از معرفی این الگوریتم ابتدا چند تابع را که در این الگوریتم استفاده

می شوند معرفی خواهم کرد :

این : gdi موجود در کتابخانه 32 CreateCompatibleDC 1 – تابع

مطابق با مقصد مشخص شده ( DC ( device context تابع یک حافظه

می سازد .

: gdi موجود در کتابخانه 32 CreateCompatibleBitmap 2 – تابع

مشخص شده ، DC مطابق با مقصدی که توسط bitmap این تابع یک

می سازد .

را از حافظه DC یک : gdi موجود در کتابخانه 32 DeleteDC 3 – تابع

پاک می کند .

رنگ یک rgb مقدار : gdi موجود در کتابخانه 32 GetPixel 4 – تابع

پیکسل را برمی گرداند .

یک شی را از درون : gdi موجود در کتابخانه 32 SelectObject 5 – تابع

انتخاب می کند . DC یک

١٩٨

یک شی را حذف : gdi موجود در کتابخانه 32 DeleteObject 6 – تابع

کرده و کلیه منابع اختصاص یافته به آنرا آزاد می کند .

تداخل دو : user موجود در کتابخانه 32 IntersectRect 7 – تابع

مستطیل را محاسبه می کند و مختصات مستطیل تداخلی را در یک

مستطیل مقصد قرار می دهد .

حال که با این توابع آشنا شدید به سراغ معرفی الگوریتم می روم . در

از نوع مستطیل تعرف کنیم : type این الگوریتم ابتدا باید یک

Type RECT

Left As Long

Top As Long

Long Right As

Bottom As Long

End Type

همچنین نیاز به تعریف متغیرهای زیر داریم :

Dim MaskRect1 As RECT

RECT Dim MaskRect2 As

Dim DestRect As RECT

Dim i As Long

Dim j As Long

As Boolean Dim Collision

Dim MR1SrcX As Long

Dim MR1SrcY As Long

Long Dim MR2SrcX As

Dim MR2SrcY As Long

Dim hNewBMP As Long

Long Dim hPrevBMP As

Dim tmpObj As Long

Dim hMemDC As Long

١٩٩

در پروژه خود BitBlt سپس باید کلیه توابع فوق را بهمراه تابع

می توانید فرمت این توابع را API viewer کنید . با استفاده از declare

پیدا کنید .

شکل کلی تابع تشخیص برخورد بصورت زیر است :

ByVal ,Public Function CollisionDetect(ByVal x1 As Long

y1 As Long, ByVal X1Width As Long, ByVal Y1Height As

As Long, ByVal Mask1LocY As Long,ByVal Mask1LocX

,Long, ByVal Mask1Hdc As Long, ByVal x2 As Long

ByVal y2 As Long,ByVal X2Width As Long, ByVal

As Long, ByVal Y2Height As Long, ByVal Mask2LocX

Mask2LocY As Long,ByVal Mask2Hdc As Long) As

Boolean

sprite بترتیب مختصات نقطه بالایی سمت چپ y و 2 x و 2 y و 1 x که 1

اول و دوم هستند .

بترتیب ابعاد مستطیا y2height و x2width و y1height و x1width

هستند . sprite محیطی دو

هستند . sprite های ماسکهای دو DC ،Mask2Hdc و Mask1Hdc

٢٠٠

مختصات افست ماسک اول و Mask1LocY و Mask1LocX

مختصات افست ماسک دوم می باشند . Mask2LocY و Mask2LocX

را تنظیم می کنیم : sprite ابتدا ابعاد مستطیلهای محیطی دو

MaskRect1.Left = x1

y1 = MaskRect1.Top

MaskRect1.Right = x1 + X1Width

Y1Height + MaskRect1.Bottom = y1

MaskRect2.Left = x2

MaskRect2.Top = y2

X2Width + MaskRect2.Right = x2

MaskRect2.Bottom = y2 + Y2Height

تداخل مستطیلهای محیطی بررسی IntersectRect سپس توسط تابع

می شود و در صورت تداخل ، مستطیل تداخل استخراج می شود :

MaskRect2)x ,i = IntersectRect(DestRect, MaskRect1

If i = 0 Then

CollisionDetect = False

حال به سراغ بررسی پیکسل به پیکسل می رویم . برای اینکار بایستی

های دو ماسک بدست HDC را برای sourceY و sourceX مقادیر

آوریم :

Else

x2 Then < If x1

MR1SrcX = 0

٢٠١

x1 - x2 = MR2SrcX

Else

MR2SrcX = 0

MR1SrcX = x2 - x1

End If

Then y2 < If y1

MR2SrcY = y1 - y2

MR1SrcY = 0

Else

here ' MR2SrcY = 0

MR1SrcY = y2 - y1 - 1

End If

را برای انجام مقایسه تخصیص می Bitmap و DC سپس حافظه های

دهیم :

= hMemDC

CreateCompatibleDC(Screen.ActiveForm.hdc)x

= hNewBMP

CreateCompatibleBitmap(Screen.ActiveForm.hdc,

DestRect.Bottom - ,DestRect.Right- DestRect.Left

DestRect.Top)x

hNewBMP)x ,hPrevBMP = SelectObject(hMemDC

قرار می دهیم : hMemDc را در حافظه sprite اولین

- i = BitBlt(hMemDC, 0, 0, DestRect.Right

DestRect.Left,DestRect.Bottom- DestRect.Top,Mask1Hdc,

MR1SrcY + ,MR1SrcX + Mask1LocX

Mask1LocY,vbSrcCopy) x

٢٠٢

می کنیم : OR اول sprite دوم را با sprite

- i = BitBlt(hMemDC, 0, 0, DestRect.Right

DestRect.Left,DestRect.Bottom- DestRect.Top,Mask2Hdc,

MR2SrcY + Mask2LocY, ,MR2SrcX + Mask2LocX

vbSrcPaint)x

را بررسی می کنیم . اگر رنگ یکی از hMemDC حال تمام پیکسل های

این پیکسلها سیاه باشد یعنی تداخل وجود دارد :

Collision = False

DestRect.Top - 1 - For i = 0 To DestRect.Bottom

For j = 0 To DestRect.Right - DestRect.Left - 1

GetPixel(hMemDC, j, i) = 0 Then If

Collision = True

Exit For

If End

Next

If Collision = True Then

Exit For

If End

Next

CollisionDetect = Collision

ها را از بین می بریم : DC ها و object در پایان تمام

tmpObj = SelectObject(hMemDC, hPrevBMP)x

DeleteObject(tmpObj)x = tmpObj

tmpObj = DeleteDC(hMemDC)x

٢٠٣

قسمت اول DirectX-Graphic آموزش

٢٠۴

قسمت اول DirectX-Graphic آموزش

direct3D موضوع : ساخت یک واسط

ابزاری برای ساخت تصاویر ثابت و متحرک دو بعدی و سه DirectX8

بعدی می باشد .

ابتدا بایستی آنرا روی سیستم خود نصب کنید . DirectX برای کار با 8

را انتخاب References گزینه project از منوی vb سپس در محیط

کنید . در فرمی که ظاهر می شود اطمینان حاصل کنید که گزینه

فعال باشد . DirectX8 for VB type library

DirectX بایستی از تعریف نمودن شی پایه 8 DirectX برای کار با 8

شروع نمود :

Dim Dx as DirectX8

برای کنترل اشی ا سه بعدی بکار می رود : Direct3D شی 8

Dim D3D as Direct3D8

سخت افزار مربوط به رندر تصاویر را ، Direct3DDevice شی 8

مشخص می کند :

Dim D3DDevice as Direct3DDevice8

٢٠۵

را تعریف می initialise ( ) تابع ، Direct3D حال برای شروع کار با

را برمی گرداند : true کنیم . اگر اینکار درست انجام شود تابع ، مقدار

public function initialise () as boolean

DispMode as D3DISPLAYMODE Dim

حالت نمایش را مشخص می نماید . D3DISPLAYMODE شی

Dim D3Dwindow as D3DPRESENT_PARAMETERS

شما چگونه باشد . viewport شی فوق مشخص می کند که

را می سازیم : DirectX حال شی اصلی 8

Set Dx=New DirectX8

سپس شی اصلی ساخت واسط سه بعدی را می سازیم :

set D3D.Dx.Direct3Dcreate()

سپس حالت فعلی نمایش را با دستور زیر استخراج می کنیم :

٢٠۶

D3D.getadapterdisplaymode

D3DADAPTER_DEFAULT,dispmode

داریم : DirectX حال دو حالت برای کار با

windowed mode - 1

fullscrean mode - 2

اطلاع DirectX 1 - برای کار با حالت پنجره ای ابتدا این موضوع را به

می دهیم :

D3Dwindow.windowed=1

تصویر را مشخص می کنیم ( در اینجا چند انتخاب referesh سپس نوع

وجود دارد که در صورت نیاز به اطلاعات بیشتر با من تماس بگیرید . ) :

D3Dwindow.swapeffect=D3DSWAPEFFECT_COPY_VS

YNC

سپس بایستی فرمت بافر نگهدارنده تصاویر را مشخص کنیم :

D3Dwindow.backbufferformat=dispmode.format

را مشخص کرده refresh 2 - برای کار با حالت تمام صفحه ، ابتدا نوع

٢٠٧

سپس تعداد بافر های تصویر و سرانجام نوع و سایز بافر را مشخص

می نمائیم :

D3Dwindow.swapeffect=D3DSWAPEFFECT_DISCARD

D3Dwindow.backbuffercount=1

D3Dwindow.backbufferformat=dispmode.format

D3Dwindow.backbufferheight=dispmode.height

D3Dwindow.backbufferwidth=dispmode.width

سپس پنجره نمایش مشخص می گردد :

D3Dwindow.hdevicewindow=frmMain.hwnd

ساخته شود که یا از طریق سخت افزار و یا device @حال بایستی یک

نرم افزار تصاویر را رندر نماید :

Set

D3DDevice=D3Dcreatedevice(D3DADAPTER_DEFAULT

,D3DDEVTYPE_HAL,

frmMain.hwnd,D3DCREATE_SOFTWARE_VERTEXPR

,OCESSING

,D3Dwindow)x

sub end

٢٠٨

درصورتی که کارت گرافیک شما امکانات رندر سخت افزاری تصاویر را

D3DDEVTYPE_HAL بجای D3DDEVTYPE_REF ندارد از

استفاده کنید .

را بنویسیم . البته در این درس تصویری render حال بایستی روتین

برای رندر نداریم و تنها چگونگی نوشتن این روتین را بیان خواهم کرد :

مربوط به رندر ، قبل از کشیدن تصویر در آن device 1 - ابتدا بایستی

پاک شود :

D3DDevice.clear 0,byval

H0,1#,0&,D3DCLEAR_TARGET,0

ای که در دستور فوق آمده رنگ زمینه صفحه را مشخص می hex عدد

کند

2 - سپس بایستی تصاویر مورد نظر را رندر کنیم . اینکار توسط

دستورات زیر انجام می شود :

D3DDevice.beginscence

' between these two lines all rendering calls go

D3DDEvice.endscence

کنید : update 3 - در پایان بایستی صفحه را

D3DDevice.present byval 0,byval 0,0,byval 0

٢٠٩

قسمت دوم DirectX-Graphic آموزش

موضوع : بدست آوردن مشخصات و تواناییهای گرافیکی یک سیستم

DirectX-Graphic توسط

1 - شمارش تعداد آداپتورهای گرافیکی یک سیستم : فرض کنید متغیر

باشد . همچنین شی long متغیری از نوع nAdapters

یک ساختار است که اطلاعات D3DADAPTER_IDENTIFIER8

مربوط به آداپتور را نگه می دارد . در اینصورت روتین

بصورت زیر خواهد بود : enumerateAdapters

D3DADAPTER_IDENTIFIER8 Dim adapterinfo as

Private Sub EnumerateAdapters

integer Dim i as

nadapters=D3D.Getadaptercount

برای بدست آوردن جزئیات آداپبورها بصورت زیر عمل می کنیم :

nadapters-1 for i=0 to

D3D.GetadapterIdentifier i ,0,adapterinfo

نام این آداپتور بصورت لیستی از کدهای اسکی است که بایستی آنها را

قرار دهیم : string درون یک

٢١٠

for j=0 to 511

chr$(adapterinfo.description(j)) x & name=name

next j

x (" ",(name=replace(name,chr$(0

end sub

نام آداپتور قرار خواهد گرفت . name بنابراین در متغیر

D3DCAPS فرض کنید شی 8 : Rendering 2 - مشخص کردن نوع

آداپتور را نشان دهد . در اینصورت روتین rendering توانایی

بصورت زیر خواهد بود : EnumerateDevices

Private EnumerateDevices

resume next On Local Error

Dim Caps as D3DCAPS8

Example deviceindex=0 'For

D3D.Getdevicecaps

deviceindex,D3DDEVTYPE_HAL,caps

err.number=D3DERR_NOTAVAILABLE then if

اگر آداپتور امکان رندر سخت افزاری نداشته باشد در اینصورت :

x ("(MsgBox("Reference Rasterizer(REF

else

MsgBox("Hardware Acceleration(HAL)+Reference

x ("(Rasterizer(REF

٢١١

end if

end sub

نمایشی آداپتور : Mode 3 - شمارش تعداد

و در r= بودن امکان رندر ، متغیر 2 REF فرض کنید در صورت

r= غیراینصورت 1

اطلاعات مدهای نمایشی D3DDISPLAYMODE باشد . همچنین شی

را در خود

باشد . در long از نوع nModes دارد . همچنین فرض کنید متغیر

بصورت زیر خواهد بود : enumeratedispmodes اینصورت روتین

Long) x Private Sub EnumerateDispModes(r as Long,n as

Dim i as integer

Dim mode_tmp as D3DDISPLAYMODE

For Example' deviceindex=0

nModes=D3D.Getadaptermodecount(deviceindex) x

nModes-1 for i=0 to

D3D.EnumAdapterModes(deviceindex,i,mode_tmp) x

ها را به دو گروه 16 بیتی و 32 بیتی تقسیم می کنیم : Mode ابتدا

if mode_tmp.format=D3DFMT_R8G8B8 or

mode_tmp=D3DFMT_X8R8G8B8 or

mode_tmp=D3DFMT_A8R8G8B8 then

قابل پذیرش و معتبر است یا نه : device حال چک می کنیم که

٢١٢

if

D3D.checkdevicetype(deviceindex,r,mode_tmp.format,mo

then 0=<(de_tmp.format,Flase

& mode_tmp.height & "X" & MsgBox(mode_tmp.width

Bit 32"

" & mode_tmp.format ) x & ":FMT

end if

else

if

D3D.checkdevicetype(deviceindex,r,mode_tmp.format,mo

then 0=<(de_tmp.format,Flase

& mode_tmp.height & "X" & MsgBox(mode_tmp.width

Bit 16"

" & mode_tmp.format ) x & ":FMT

end if

end if

next i

4 - مشخص کردن توانایی های آداپتور گرافیکی : فرض کنید در صورت

باشد : r= و در غیراینصورت 1 r= بودن امکان رندر ، متغیر 2 REF

x (Private Sub EnumerateHardware(r as long

Dim caps as D3DCAPS8

D3D.Getdevicecaps deviceindex,r,caps

Caps.MaxActiveLights = -1 Then If

x "MsgBox "Maximum Active Lights: Unlimited

Else

& " :MsgBox "Maximum Active Lights

Caps.MaxActiveLights

٢١٣

If End

& " :MsgBox "Maximum Point Vertex size

Caps.MaxPointSize

& " :Maximum Texture Size" MsgBox

& "X" & Caps.MaxTextureWidth

Caps.MaxTextureHeight

& " :MsgBox "Maximum Primatives in one call

Caps.MaxPrimitiveCount

If Caps.TextureCaps And

Then D3DPTEXTURECAPS_SQUAREONLY

MsgBox "Textures must always be square" x

End If

Caps.TextureCaps And If

D3DPTEXTURECAPS_CUBEMAP Then

Cube Mapping" x MsgBox "Device Supports

End If

If Caps.TextureCaps And

Then D3DPTEXTURECAPS_VOLUMEMAP

MsgBox "Device Supports Volume Mapping" x

End If

And D3DDEVCAPS_PUREDEVICE If Caps.DevCaps

Then

Option" x MsgBox "Device supports the Pure Device

End If

If Caps.DevCaps And

Then D3DDEVCAPS_HWTRANSFORMANDLIGHT

MsgBox "Device supports hardware transform and

lighting" x

If End

If Caps.DevCaps And

D3DDEVCAPS_HWRASTERIZATION Then

use Hardware Rasterization" x MsgBox "Device can

End If

If Caps.Caps2 And

D3DCAPS2_CANCALIBRATEGAMMA Then

MsgBox "Device can Calibrate Gamma" x

٢١۴

If End

If Caps.Caps2 And

D3DCAPS2_CANRENDERWINDOWED Then

Render in Windowed Mode" x MsgBox "Device can

End If

D3DCAPS2_FULLSCREENGAMMA If Caps.Caps2 And

Then

fullscreen mode" MsgBox "Device can calibrate gamma in

x

End If

If Caps.RasterCaps And

Then D3DPRASTERCAPS_FOGRANGE

MsgBox "Device supports range based fog calculations" x

End If

Caps.RasterCaps And If

D3DPRASTERCAPS_ANISOTROPY Then

Anisotropic Filtering" x MsgBox "Device supports

End If

If Caps.RasterCaps And

D3DPRASTERCAPS_ZBUFFERLESSHSR Then

Z-Buffer/Depth MsgBox "Device does not require a

Buffer" x

End If

قسمت سوم DirectX-Graphic آموزش

موضوع : رسم اشکال دو بعدی

DirectX های 8 object مروری بر

است و به شما directX این شی ، شی مرکزی برای : DirectX8 - 1

را می دهد . DirectX امکان دسترسی به توابع و اشیا

شی اصلی برای کار با محیط سه بعدی می باشد . : Direct3D8 - 2

است و همچنین شامل توابعی Direct3DDevice هدف از آن ، ساخت 8

٢١۵

برای مشخص کردن توانایی های کارت گرافیک است .

، textures این شی مسئول ساخت بافتها : Direct3DDevice8 - 3

و همچنین materials مدیریت نورها در یک صحنه ، مدیریت مواد

صحنه است . در واقع این شی ، قلب نمایشی کار شماست . render

گر چه همیشه نیازی به استفاده از این شی نیست ، اما : D3DX8 - 4

تر userfriendly این شی شامل توابعی برای ساخت برنامه های

است . مثلا ساخت اشیا سه بعدی ( مثل کره ، مکعب و DirectX توسط

... ) ، ساخت بافتها ، ساخت سطوح و غیره

شروع کار برای رسم اشیا دوبعدی

را تعریف می کنیم . این ثابت توصیف " فرمت قابل FVF ابتدا ثابت

دو بعدی vertex برای یک " flexible-vertex-format انعطاف نقطه

انتقال یافته و ساده شده می باشد .

معرفی کنیم : vertex سپس بایستی یک ساختار برای توصیف این

Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or

D3DFVF_DIFFUSE Or D3DFVF_SPECULAR

Private Type TLVERTEX

X As Single

As Single Y

Z As Single

rhw As Single

color As Long

Long specular As

tu As Single

tv As Single

End Type

فرض کنید بخواهیم یک مربع را در صفحه رسم کنیم . برای رسم آن نیاز

٢١۶

را از نوع TriStrip داریم . بنابراین آرایه vertex به 4 عدد

تعریف میکنیم : TLVERTEX

Dim TriStrip (0 To 3) As TLVERTEX

که در درس 1 با آن آشنا شدید می رویم و initialize حال به سراغ تابع

دستورات زیر را به آن اضافه می کنیم :

boolean Private Function Initialize as

.

.

.

FVF را طوری تنظیم می کنیم که از vertex ابتدا سیستم سایه زنی

استفاده کند .

D3DDevice.SetVertexShader FVF

های دو بعدی غیر فعال می کنیم vertex را برای lighting حال سیستم

زیرا نیازی به آن نداریم :

D3DRS_LIGHTING,false D3DDevice.SetRenderState

٢١٧

را اجرا کنیم . این تابع را در initializeGeometry حال بایستی تابع

باشد دراینصورت true ادامه توضیح خواهم داد . اگر نتیجه این تابع

به درستی انجام شده است : initialize

initialize=true if initializeGeometry()=true then

end function

در این درس ، تابعی ساده است که تنها initializeGeometry تابع

ها را مقدار دهی می کند . برای رسم یک مربع نیاز به Vertex آرایه

در جهت عقربه های ساعت داریم ( این مربع شامل 2 vertex مقداردهی 4

مثلث است )

Boolean Private Function InitialiseGeometry() As

:On Error GoTo BOut

(color = RGB(200, 100, 0

(CreateTLVertex(100, 100, 0, 1, color, 0, 0, 0 = (TriStrip(0

(CreateTLVertex(300, 100, 0, 1, color, 0, 0, 0 = (TriStrip(1

(CreateTLVertex(100, 300, 0, 1, color, 0, 0, 0 = (TriStrip(2

(CreateTLVertex(300, 300, 0, 1, color, 0, 0, 0 = (TriStrip(3

True = InitialiseGeometry

٢١٨

Exit Function

:BOut

InitialiseGeometry = False

End Function

از تابع vertex همانطور که مشاهده می کنید برای تعریف

استفاده شده است . این تابع صرفا مقادیر CreateTLVERTEX

را مقداردهی می کند : TLVERTEX ساختار

As Private Function CreateTLVertex(X As Single, Y

Single, Z As Single, rhw As Single, color As Long, specular

Single, tv As Single) As TLVERTEX As Long, tu As

را floating point نکته : ضمن اینکه شما می توانید مقادیر اعشاری

مختصاتها را با Direct3D ، بکار ببرید z و y و x برای مختصاتهای

گردکردن آنها تخمین می زند و بنابراین ممکنست باعث ایجاد نتایج

ناخواسته شود .

CreateTLVertex.X = X

Y = CreateTLVertex.Y

CreateTLVertex.Z = Z

CreateTLVertex.rhw = rhw

color = CreateTLVertex.color

CreateTLVertex.specular = specular

tu = CreateTLVertex.tu

CreateTLVertex.tv = tv

End Function

٢١٩

را بنویسیم : Render حال بایستی تابع

()Public Sub Render

,0 ,D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET

0 ,#1

D3DDevice.BeginScene

D3DDevice.DrawPrimitiveUP

,(D3DPT_TRIANGLESTRIP, 2, TriStrip(0

Len(TriStrip(0))x

D3DDevice.EndScene

ByVal 0 ,0 ,D3DDevice.Present ByVal 0, ByVal 0

End Sub

ساختار اصلی برای اجرای توابع فوق بصورت زیر است :

--Main part--

Initialize

yourevent=true Do While

Render

DoEvents

Loop

قسمت چهارم DirectX-Graphic آموزش

موضوع : آشنایی با برخی اصطلاحات

ها است که یک شی سه بعدی را face مش ، مجموعه ای از : Mesh -1

روی صفحه تشکیل می دهند .

٢٢٠

یک چند ضلعی است که توسط مجموعه ای از نقاط به نام : Face - 2

ساخته می شود . vertex

یک نقطه در فضای سه بعدی است که برای دادن موقعیت ، : Vertex - 3

استفاده می شود . face و زاویه یک scale

Vertex برای نمایش یک D3DVERTEX از شیی بنام Direct3D - 4

ها vertex نیز از آرایه ای از face استفاده می کند . برای ساخت

استفاده می شود . آرایه همیشه بایستی قابل تقسیم به سه باشد زیرا

های مثلثی ساخته می شوند . هنگامیکه این مثلثها کنار face اشکال از

از بافری با Direct3D . هم گذاشته شوند ، شی سه بعدی را می سازند

می گوید که با چه direct3D استفاده می کند که با Index Buffer نام

ها بایستی همیشه در جهت Index . ها را رسم نماید vertex ترتیبی

عقربه های ساعت مشخص شوند .

قسمت پنجم DirectX-Graphic آموزش

٢٢١

به اشکال دو بعدی Texture موضوع : اختصاص بافت

در این درس می خواهیم یک مربع که دارای بافت می باشد را رسم کنیم .

استفاده می کنیم . همچنین شی D3DX برای اینکار از کتابخانه کمکی 8

را نیز استفاده می نمائیم . Direct3DTexture8

Dim D3DX as D3DX8

Direct3DTexture8 Dim Texture as

بافت مربوطه را از روی یک فایل Initialize حال بایستی در تابع

کنیم : load تصویری

Private Function Initialize as boolean

.

.

.

Set

Texture=D3DX8.CreateTextureFromFile(D3DDevice,app.

x (yourfilename & path

end function

نیز بصورت زیر خواهد بود : Render تابع

Private Sub Render

D3DCLEAR_TARGET,0,1#,0,0 D3DDevice.clear 0,byval

http://sheidaian.persianblog.com

http://iranmehr.bizhat.com توسط گروه ایران مھر sheidaian.persianblog برگرفتھ از سایت

٢٢٢

D3DDevice.beginscence

Texture,0 D3DDevice.SetTexture

D3DDevice.DrawprimitiveUP

D3DPT_TRIANGLESTRIP,2,Tripstrip(0),len(Tristrip(0))

x

.

.

.

function end

قسمت ششم DirectX-Graphic آموزش

DirectX موضوع : مفاهیم اولیه رسم اشکال سه بعدی در 8

یک مکعب را رسم می کنیم . برای Direct3D در این درس با استفاده از

٢٢٣

این منظور ابتدا نیاز به یک بافر داریم که بتوانیم شکل مورد نظر خود را

در آن ذخیره کنیم :

Dim VBuffer as Direct3DVertexBuffer8

های سه بعدی استفاده می کنیم . برای vertex برای رسم مکعب از

اینکار نیاز به تعریف یک تایپ جدید داریم :

Private Type LITVERTEX

x as single

single y as

z as single

color as long

specular as long

tu as single

as single tv

end type

توصیف گر این فرمت ، بصورت زیر است :

Const Lit_FVF = (D3DFVF_XYZ Or D3DFVF_DIFFUSE

D3DFVF_SPECULAR Or D3DFVF_TEX1)x Or

برای توصیف مکعب در این درس از روشی غیرکارامد استفاده شده

استفاده شده ( در درسهای vertex است . به این ترتیب که از 36 عدد

٢٢۴

vertex بعدی متدهایی معرفی خواهند شد که اجازه می دهند از 8 عدد

باری توصیف مکعب استفاده کنید ) .

Dim cube(35) as LITVERTEX

سپس باید یکسری ماتریس سه بعدی تعریف کنیم :

ها در vertex است که نشان می دهد چگونه matworld ، اولین ماتریس

است که matview ، فضای سه بعدی قرار گرفته اند . دومین ماتریس

نشان می دهد دوربین ( نقطه دید ) در کجا قرار گرفته و سومین ماتریس

است که نشان می دهد دوربین چگونه دنیای سه بعدی را matproj ،

روی صفحه دو بعدی نشان می دهد :

Dim matworld as D3DMATRIX

D3DMATRIX Dim matview as

Dim matproj as D3DMATRIX

بایستی چک کنیم که آیا می device قبل از ساخت Initialize در تابع

شانزده بیتی استفاده کنیم یا نه ؟ Z توانیم از یک بافر

,If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT

D3DDEVTYPE_HAL, DispMode.Format,

,D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE

D3DFMT_D16) = D3D_OK Then

D3DWindow.AutoDepthStencilFormat = D3DFMT_D16

bit Z-Buffer '16

٢٢۵

را اجرا کنید . سپس باید سیستم D3DCreateDevice حال بایستی متد

مان تنظیم کنیم : vertex را با فرمت vertex سایه زنی

D3DDevice.SetVertexShader Lit_FVF

همچنین سیستم نورپردازی را غیر فعال می کنیم :

False ,D3DDevice.SetRenderState D3DRS_LIGHTING

هیچ مثلثی را که در دید شما نباشد رسم نخواهد کرد . برای Direct3D

آنرا متوقف کنید همچنین culling متوقف کردن این امر بایستی حالت

ها را بترتیب عقربه های ساعت معرفی کنید : vertex

,D3DDevice.SetRenderState D3DRS_CULLMODE

D3DCULL_NONE

را فعال سازید : Z سپس باید فرمت بافر

D3DDevice.SetRenderState D3DRS_ZENABLE, 1

حال به بخش تعریف ماتریسها می رسیم :

٢٢۶

قسمت هفتم DirectX-Graphic آموزش

در بحث قبلی به تعریف ماترسها رسیدیم .

هایی که vertex این ماتریس برای نگهداری تمام : World Matrix - 1

برای رندر فرستاده می شوند بکار می رود . مقادیر موجود در این

را می تواند تغییر دهد . یکی از vertex ماتریس ، موقعیت یک

و تغییر transmittion انتقال ، rotation کاربردهای آن انجام دوران

است . scaling اندازه

برای ساخت این ماتریس از دستور زیر استفاده می کنیم :

D3DXMatrixIdentify matworld

مربوطه تایید می کنیم : device حال این ماتریس را برای

D3DDevice.SetTransform D3DTS_WORLD,matworld

این ماتریس را بعنوان یک دوربین در نظر بگیرید : View Matrix - 2

که بوسیله یک نقطه شروع و یک نقطه پایانی مشخص می شود ( مشابه

رو به بالاست ) : y که معمولاً در طول محور up vector یک

,(D3DXMatrixLookAtLH matView, MakeV(0, 5, 9

MakeV(0, 0, 0),MakeV(0, 1, 0) x

matView ,D3DDevice.SetTransform D3DTS_VIEW

٢٢٧

که در اینجا استفاده شده بصورت زیر است : MakeV تابع

z As ,Private Function MakeV(x As Single, y As Single

Single) As D3DVECTOR

MakeV.x = x

MakeV.y = y

MakeV.z = z

Function End

این ماتریس مشخص می کند چه منطقه ای از : Projection Matrix - 3

باشد . همچنین مشخص می کند visible فضای جهانی برای رندر کردن

چه مقدار می توانیم بطور افقی ببینیم ( زاویه دید بزرگتر منجر به دید

بزرگتر می شود ) :

500 ,0,1 ,D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1

رادیان استفاده شده همچنین نسبت pi/ در دستور فوق از زاویه دید 4

1:1 استفاده شده است . قسمتهای سوم و چهارم مشخص می کنند فقط

مثلثهایی کشیده شوند که با ابعاد بزرگتر از یکدهم دوربین و کوچکتر از

500 برابر دوربین هستند .

را خواهیم داشت : device حال دستور اختصاص به

,D3DDevice.SetTransform D3DTS_PROJECTION

matProj

٢٢٨

را صدا InitializeGeometry بعد از تعریف ماتریسها بایستی تابع

استفاده شده است . اگر DFC کنیم . در این تابع از یک ثابت با نام

باشد مکعب بطور کامل کشیده می شود و اگر بزرگتر از یک DFC=1

های آن جدا از هم دیده خواهند شد . همچنین توجه کنید که face ، باشد

ها استفاده شده است . vertex برای ذخیره داده vertex از بافرهای

ساختار این تابع بصورت زیر خواهد بود :

vertex 1 - پر کردن ساختارهای

Front'

color, 0, 0, 0)x ,Cube(0) = CreateLitVertex(-1, 1, DFC

x(0 ,Cube(1) = CreateLitVertex(1, 1, DFC, color, 0, 0

Cube(2) = CreateLitVertex(-1, -1, DFCcolor, 0, 0, 0)x

CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)x = (Cube(4

DFC, color, 0, 0, 0)x ,1- ,Cube(5) = CreateLitVertex(1

Back'

color, 0, 0, 0)x ,Cube(6) = CreateLitVertex(-1, 1, -DFC

x(0 ,Cube(7) = CreateLitVertex(1, 1, -DFC, color, 0, 0

Cube(8) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x

CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x = (Cube(9

DFC, color, 0, 0, 0)x- ,1- ,Cube(10) = CreateLitVertex(-1

x(0 ,0 ,Cube(11) = CreateLitVertex(1, -1, -DFC, color, 0

Right'

x(0 ,Cube(12) = CreateLitVertex(-DFC, 1, -1, color, 0, 0

Cube(13) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x

CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x = (Cube(14

CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x = (Cube(15

٢٢٩

color, 0, 0, 0)x ,1- ,1- ,Cube(16) = CreateLitVertex(-DFC

x(0 ,Cube(17) = CreateLitVertex(-DFC, -1, 1, color, 0, 0

Left'

x(0 ,Cube(18) = CreateLitVertex(DFC, 1, -1, color, 0, 0

Cube(20) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x

CreateLitVertex(DFC, 1, 1, color, 0, 0, 0)x = (Cube(21

color, 0, 0, 0)x ,1- ,1- ,Cube(22) = CreateLitVertex(DFC

x(0 ,Cube(23) = CreateLitVertex(DFC, -1, 1, color, 0, 0

Top'

x(0 ,Cube(24) = CreateLitVertex(-1, DFC, 1, color, 0, 0

Cube(25) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)x

CreateLitVertex(-1, DFC, -1, color, 0, 0, 0)x = (Cube(26

DFC, 1, cocolor, 0, 0, 0)x ,Cube(27) = CreateLitVertex(1

x(0 ,0 ,Cube(29) = CreateLitVertex(1, DFC, -1, color, 0

Bottom'

x(0 ,Cube(30) = CreateLitVertex(-1, -DFC, 1, color, 0, 0

Cube(31) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x

CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x = (Cube(32

DFC, 1, color, 0, 0, 0)x- ,Cube(33) = CreateLitVertex(1

x(0 ,0 ,Cube(34) = CreateLitVertex(-1, -DFC, -1, color, 0

Cube(35) = CreateLitVertex(1, -DFC, -1, color, 0, 0, 0)x

خالی با سایز مورد نظر : vertex 2 - ساخت یک بافر

= Set VBuffer

D3DDevice.CreateVertexBuffer(Len(Cube(0)) * 36, 0,

D3DPOOL_DEFAULT)x ,Lit_FVF

٢٣٠

3 - پر کردن بافر مربوطه با داده ها :

,36 * ((D3DVertexBuffer8SetData VBuffer, 0, Len(Cube(0

Cube(0)x ,0

می رویم : Render حال به سراغ روتین

Public Sub Render

D3DCLEAR_TARGET Or ,D3DDevice.Clear 0, ByVal 0

black D3DCLEAR_ZBUFFER, 0, 1#, 0 '//Clear the screen

D3DDevice.BeginScene

Len(Cube(0))x ,D3DDevice.SetStreamSource 0, VBuffer

,D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0

12

D3DDevice.EndScene

0 D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal

End Sub

ساختار اصلی برنامه بصورت زیر خواهد بود :

Dim RotateAngle As Single

D3DMATRIX '//To hold temporary Dim matTemp As

call Initialize

bRunning Do While

RotateAngle = RotateAngle + 0.1

٢٣١

RotateAngle = RotateAngle - Then 360 =< If RotateAngle

360

world matrix D3DXMatrixIdentity matWorld '//Reset our

D3DXMatrixIdentity matTemp

RotateAngle * (pi / 180) ,D3DXMatrixRotationX matTemp

x

matTemp ,D3DXMatrixMultiply matWorld, matWorld

D3DXMatrixIdentity matTemp

RotateAngle * (pi / 180) ,D3DXMatrixRotationZ matTemp

x

matTemp ,D3DXMatrixMultiply matWorld, matWorld

matWorld ,D3DDevice.SetTransform D3DTS_WORLD

Render

DoEvents

Loop

قسمت هشتم DirectX-Graphic آموزش

موضوع : نورپردازی و اختصاص بافت به اشیا سه بعدی

٢٣٢

در این درس می خواهیم به مکعب درس قبل بافت اختصاص داده و نیز

آنرا با یک منبع نور ، نورپردازی کنیم .

ها را بصورت زیر تعریف می کنیم : vertex ابتدا تایپ

Private Type UnlitVertex

X As Single

Single Y As

Z As Single

nx As Single

ny As Single

nz As Single

Single tu As

tv As Single

End Type

توصیفگر این فرمت بصورت زیر خواهد بود :

٢٣٣

Const Unlit_FVF = (D3DFVF_XYZ Or

(Or D3DFVF_TEX1 D3DFVF_NORMAL

همچنین مکعب ما توسط ارایه زیر مشخص می شود :

Dim Cube2(35) As UnlitVertex

را نیز بصورت زیر تعریف می کنیم : rad و pi دو ثابت

Const pi As Single = 3.141592

180 / Const Rad = pi

استفاده Direct3DTexture برای اختصاص بافت به مکعب ، از شی 8

می شود :

Dim CubeTexture As Direct3DTexture8

استفاده می شود : D3DLIGHT برای نورپردازی ، از شی 8

Dim Lights As D3DLIGHT8

٢٣۴

Initialize تغییرات مورد نیاز در تابع

در این تابع ، پارامترهای آنرا بصورت D3DDevice بعد از ساخت شی

زیر تنظیم می کنیم :

Unlit_FVF D3DDevice.SetVertexShader

1 ,D3DDevice.SetRenderState D3DRS_LIGHTING

D3DDevice.SetRenderState D3DRS_ZENABLE, 1

,D3DRS_AMBIENT D3DDevice.SetRenderState

H202020&

است . RRGGBB یک کد هگزا ambient مقدار

matproj و matview ،matworld بعد از دستورات فوق ماتریسهای

مطابق مطابل درس قبل تعریف می شوند . پس از آن بایستی بافت

کنید : load مکعب را از درون فایل تصویری مورد نظرتان

= Set CubeTexture

D3DX.CreateTextureFromFileEx(D3DDevice,

,yourfilename, 128, 128, D3DX_DEFAULT, 0

DispMode.Format, D3DPOOL_MANAGED,

,D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0

ByVal 0, ByVal 0)x

صدا زده شود و سپس تابع InitializeGeometry حال بایستی تابع

٢٣۵

فراخوانی شوند . ابتدا به توضیح تابع SetupLights

می پردازیم : InitializeGeometry

Boolean Private Function InitialiseGeometry() As

ابتدا یک بردار نرمال تعریف می کنیم :

Dim vN As D3DVECTOR

را با مقادیر عددی پر می کنیم . نرمالهای تمام cube سپس آرایه 2

ها را ابتدا با بردار vertex

0،0،0 ] تعریف می کنیم . این مقدا بعدا تغییر خواهد کرد : ]

(0 ,Cube2(0) = CreateVertex(-1, -1, 1, 0, 0, 0, 0

(Cube2(1) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1

(CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1 = (Cube2(2

Cube2(1), ,(vN = GenerateTriangleNormals(Cube2(0

((Cube2(2

= Cube2(0).nx = vN.X: Cube2(0).ny = vN.Y: Cube2(0).nz

vN.Z

= Cube2(1).nx = vN.X: Cube2(1).ny = vN.Y: Cube2(1).nz

vN.Z

= Cube2(2).nx = vN.X: Cube2(2).ny = vN.Y: Cube2(2).nz

vN.Z

٢٣۶

(Cube2(3) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1

(CreateVertex(-1, -1, 1, 0, 0, 0, 0, 0 = (Cube2(4

(0 ,1 ,0 ,0 ,Cube2(5) = CreateVertex(1, -1, 1, 0

,(vN = GenerateTriangleNormals(Cube2(3), Cube2(4

((Cube2(5

= Cube2(3).nx = vN.X: Cube2(3).ny = vN.Y: Cube2(3).nz

vN.Z

= Cube2(4).nx = vN.X: Cube2(4).ny = vN.Y: Cube2(4).nz

vN.Z

= Cube2(5).nx = vN.X: Cube2(5).ny = vN.Y: Cube2(5).nz

vN.Z

Back'

(1 ,Cube2(6) = CreateVertex(-1, 1, -1, 0, 0, 0, 0

(Cube2(7) = CreateVertex(1, 1, -1, 0, 0, 0, 1, 1

(CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0 = (Cube2(8

GenerateTriangleNormals(Cube2(6), Cube2(7), = vN

((Cube2(8

Cube2(6).ny = vN.Y: Cube2(6).nz = :Cube2(6).nx = vN.X

vN.Z

vN.Y: Cube2(7).nz = = Cube2(7).nx = vN.X: Cube2(7).ny

vN.Z

= Cube2(8).nx = vN.X: Cube2(8).ny = vN.Y: Cube2(8).nz

vN.Z

٢٣٧

(Cube2(9) = CreateVertex(1, -1, -1, 0, 0, 0, 1, 0

(CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0 = (Cube2(10

(1 ,1 ,0 ,0 ,Cube2(11) = CreateVertex(1, 1, -1, 0

,(vN = GenerateTriangleNormals(Cube2(9), Cube2(10

((Cube2(11

= Cube2(9).nx = vN.X: Cube2(9).ny = vN.Y: Cube2(9).nz

vN.Z

Cube2(10).nx = vN.X: Cube2(10).ny = vN.Y: Cube2(10).nz

vN.Z =

Cube2(11).nx = vN.X: Cube2(11).ny = vN.Y: Cube2(11).nz

vN.Z =

Right'

(0 ,Cube2(12) = CreateVertex(-1, -1, -1, 0, 0, 0, 0

(Cube2(13) = CreateVertex(-1, 1, 1, 0, 0, 0, 1, 1

(CreateVertex(-1, 1, -1, 0, 0, 0, 1, 0 = (Cube2(14

GenerateTriangleNormals(Cube2(12), Cube2(13), = vN

((Cube2(14

Cube2(12).ny = vN.Y: Cube2(12).nz :Cube2(12).nx = vN.X

= vN.Z

vN.Y: Cube2(13).nz = Cube2(13).nx = vN.X: Cube2(13).ny

= vN.Z

Cube2(14).nz :Cube2(14).nx = vN.X: Cube2(14).ny = vN.Y

= vN.Z

(1 ,Cube2(15) = CreateVertex(-1, 1, 1, 0, 0, 0, 1

(Cube2(16) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0

٢٣٨

(CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1 = (Cube2(17

GenerateTriangleNormals(Cube2(15), Cube2(16), = vN

((Cube2(17

Cube2(15).ny = vN.Y: Cube2(15).nz :Cube2(15).nx = vN.X

= vN.Z

vN.Y: Cube2(16).nz = Cube2(16).nx = vN.X: Cube2(16).ny

= vN.Z

Cube2(17).nz :Cube2(17).nx = vN.X: Cube2(17).ny = vN.Y

= vN.Z

Left'

(0 ,1 ,Cube2(18) = CreateVertex(1, 1, -1, 0, 0, 0

(Cube2(19) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1

(CreateVertex(1, -1, -1, 0, 0, 0, 0, 0 = (Cube2(20

GenerateTriangleNormals(Cube2(18), Cube2(19), = vN

((Cube2(20

Cube2(18).ny = vN.Y: Cube2(18).nz :Cube2(18).nx = vN.X

= vN.Z

vN.Y: Cube2(19).nz = Cube2(19).nx = vN.X: Cube2(19).ny

= vN.Z

Cube2(20).nz :Cube2(20).nx = vN.X: Cube2(20).ny = vN.Y

= vN.Z

(1 ,Cube2(21) = CreateVertex(1, -1, 1, 0, 0, 0, 0

(Cube2(22) = CreateVertex(1, -1, -1, 0, 0, 0, 0, 0

(CreateVertex(1, 1, 1, 0, 0, 0, 1, 1 = (Cube2(23

Cube2(22), ,(vN = GenerateTriangleNormals(Cube2(21

٢٣٩

((Cube2(23

Cube2(21).nx = vN.X: Cube2(21).ny = vN.Y: Cube2(21).nz

vN.Z =

Cube2(22).nx = vN.X: Cube2(22).ny = vN.Y: Cube2(22).nz

vN.Z =

Cube2(23).nx = vN.X: Cube2(23).ny = vN.Y: Cube2(23).nz

vN.Z =

Top'

(1 ,Cube2(24) = CreateVertex(-1, 1, 1, 0, 0, 0, 0

(Cube2(25) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1

(CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0 = (Cube2(26

GenerateTriangleNormals(Cube2(24), Cube2(25), = vN

((Cube2(26

Cube2(24).ny = vN.Y: Cube2(24).nz :Cube2(24).nx = vN.X

= vN.Z

vN.Y: Cube2(25).nz = Cube2(25).nx = vN.X: Cube2(25).ny

= vN.Z

Cube2(26).nz :Cube2(26).nx = vN.X: Cube2(26).ny = vN.Y

= vN.Z

(0 ,Cube2(27) = CreateVertex(1, 1, -1, 0, 0, 0, 1

(Cube2(28) = CreateVertex(-1, 1, -1, 0, 0, 0, 0, 0

(CreateVertex(1, 1, 1, 0, 0, 0, 1, 1 = (Cube2(29

Cube2(28), ,(vN = GenerateTriangleNormals(Cube2(27

((Cube2(29

Cube2(27).nx = vN.X: Cube2(27).ny = vN.Y: Cube2(27).nz

vN.Z =

٢۴٠

Cube2(28).nx = vN.X: Cube2(28).ny = vN.Y: Cube2(28).nz

vN.Z =

Cube2(29).nx = vN.X: Cube2(29).ny = vN.Y: Cube2(29).nz

vN.Z =

Top'

(0 ,Cube2(30) = CreateVertex(-1, -1, -1, 0, 0, 0, 0

(Cube2(31) = CreateVertex(1, -1, 1, 0, 0, 0, 1, 1

(CreateVertex(-1, -1, 1, 0, 0, 0, 0, 1 = (Cube2(32

GenerateTriangleNormals(Cube2(30), Cube2(31), = vN

((Cube2(32

Cube2(30).ny = vN.Y: Cube2(30).nz :Cube2(30).nx = vN.X

= vN.Z

vN.Y: Cube2(31).nz = Cube2(31).nx = vN.X: Cube2(31).ny

= vN.Z

Cube2(32).nz :Cube2(32).nx = vN.X: Cube2(32).ny = vN.Y

= vN.Z

(1 ,Cube2(33) = CreateVertex(1, -1, 1, 0, 0, 0, 1

(Cube2(34) = CreateVertex(-1, -1, -1, 0, 0, 0, 0, 0

(CreateVertex(1, -1, -1, 0, 0, 0, 1, 0 = (Cube2(35

GenerateTriangleNormals(Cube2(33), Cube2(34), = vN

((Cube2(35

Cube2(33).ny = vN.Y: Cube2(33).nz :Cube2(33).nx = vN.X

= vN.Z

vN.Y: Cube2(34).nz = Cube2(34).nx = vN.X: Cube2(34).ny

= vN.Z

٢۴١

Cube2(35).nz :Cube2(35).nx = vN.X: Cube2(35).ny = vN.Y

= vN.Z

خالی با سایر موردنظر می سازیم : vertex سپس یک بافر

= Set VBuffer

D3DDevice.CreateVertexBuffer(Len(Cube2(0)) * 36, 0,

D3DPOOL_DEFAULT)x ,Unlit_FVF

پر می کنیم : cube ساخته شده را با داده های 2 vertex سپس این بافر

Len(Cube2(0)) * 36, ,D3DVertexBuffer8SetData VBuffer, 0

0, Cube2(0)x

استفاده GenerateTraingleNormals در دستورات فوق تابعی با نام

داده شده با آن می vertex شده است . این تابع دو بردار را از روی سه

سازد و سپس ضرب برداری ایندو را حساب می کند و سپس بردار

حاصله را نرمال می نماید :

Private Function GenerateTriangleNormals(p0 As

UnlitVertex, p1 As UnlitVertex, p2 As UnlitVertex) As

D3DVECTOR

D3DVECTOR 'Vector from points 0 to 1 Dim v01 As

to 2 0 Dim v02 As D3DVECTOR 'Vector from points

Dim vNorm As D3DVECTOR 'The final vector

٢۴٢

from points 0 to 1 and 0 to 2 Create the vectors'

p1.Z), ,D3DXVec3Subtract v01, MakeVector(p1.X, p1.Y

(MakeVector(p0.X, p0.Y, p0.Z

p2.Y, p2.Z), ,D3DXVec3Subtract v02, MakeVector(p2.X

(MakeVector(p0.X, p0.Y, p0.Z

product Get the cross'

D3DXVec3Cross vNorm, v01, v02

vector Normalize this'

D3DXVec3Normalize vNorm, vNorm

value Return the'

GenerateTriangleNormals.X = vNorm.X

vNorm.Y = GenerateTriangleNormals.Y

GenerateTriangleNormals.Z = vNorm.Z

End Function

می پردازیم . در این تابع دو شی SetupLights حال به توضیح تابع

استفاده شده است : D3DCOLORVALUE و D3DMATERIAL8

Private Function SetupLights() As Boolean

Mtrl As D3DMATERIAL8, Col As Dim

D3DCOLORVALUE

Col.b = 1 :Col.a = 1: Col.r = 1: Col.g = 1

Mtrl.Ambient = Col

Mtrl.diffuse = Col

٢۴٣

Mtrl D3DDevice.SetMaterial

Lights.Type = D3DLIGHT_DIRECTIONAL

1 = Lights.diffuse.r

Lights.diffuse.g = 1

Lights.diffuse.b = 1

(MakeVector(1, -1, 0 = Lights.Direction

D3DDevice.SetLight 0, Lights

True = SetupLights

End Function

بصورت زیر است : Render تابع

()Public Sub Render

D3DCLEAR_TARGET Or ,0 D3DDevice.Clear 0, ByVal

black D3DCLEAR_ZBUFFER, 0, 1#, 0 '//Clear the screen

D3DDevice.BeginScene

Draw the cube'

CubeTexture ,D3DDevice.SetTexture 0

((Len(Cube2(0 ,D3DDevice.SetStreamSource 0, VBuffer

,D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0

12

D3DDevice.EndScene

0 D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal

End Sub

٢۴۴

ساختار اصلی برنامه بصورت زیر است :

Call Initialise

bRunning Do While

RotateAngle = RotateAngle + 0.1

RotateAngle = RotateAngle - Then 360 =< If RotateAngle

360

matWorld D3DXMatrixIdentity

D3DXMatrixIdentity matTemp

(RotateAngle * (pi / 180 ,D3DXMatrixRotationX matTemp

matTemp ,D3DXMatrixMultiply matWorld, matWorld

D3DXMatrixIdentity matTemp

(RotateAngle * (pi / 180 ,D3DXMatrixRotationY matTemp

matTemp ,D3DXMatrixMultiply matWorld, matWorld

D3DXMatrixIdentity matTemp

(RotateAngle * (pi / 180 ,D3DXMatrixRotationZ matTemp

matTemp ,D3DXMatrixMultiply matWorld, matWorld

matWorld ,D3DDevice.SetTransform D3DTS_WORLD

٢۴۵

light خاموش کردن D3DDevice.LightEnable 0, 0

light روشن کردن D3DDevice.LightEnable 0, 1

Render

DoEvents

Loop

پارامتر اول شماره منبع نور و D3DDevice.LightEnable در متد

بودن آنرا نشان می دهد enable پارمتر دوم

قسمت نهم DirectX آموزش 8

DirectX موضوع :ترسیم متن دو بعدی در

در این درس روش ترسیم متن با دو نوع فونت را نشان خواهم داد :

D3DXFont برای رسم یک متن با فونت تعریف شده در سیستم از شی

استفاده می کنیم :

Dim MainFont as D3DXFont

IFont Dim MainFontDesc as

Dim TextRect as RECT

Dim fnt as new stdFont

texture ابتدا یک custom در حالیکه برای ایجاد یک متن با فونت

تعریف می کنیم :

٢۴۶

Dim fntTex as Direct3DTexture8

ای را از نوع vertex همچنین برای ترسیم هر کاراکتر یک آرایه

تعریف می نمائیم : TLVERTEX

Dim vertchar(3) as TLVERTEX

می رویم . در این تابع ابتدا دستورات Initialize حال به سراغ تابع

را قرا دهید سپس دستورات D3Dx و D3D مربوط به ایجاد اشیا

را انجام می D3DDevice مربوط به اختصاص آداپتور و نیز ایجاد شی

را می آوریم : rendering و shader دهیم . حال دستورات تنظیم

TL_FVF D3DDevice.SetVertexShader

D3DDevice.SetRenderState D3DRS_LIGHTING, False

را انجام rendering برای transparency سپس تنظیمات پارامترهای

می دهیم :

,D3DDevice.SetRenderState D3DRS_SRCBLEND

D3DBLEND_SRCALPHA

,D3DDevice.SetRenderState D3DRS_DESTBLEND

D3DBLEND_INVSRCALPHA

٢۴٧

D3DDevice.SetRenderState

True ,D3DRS_ALPHABLENDENABLE

شدن یا stretch را طوری فیلتر کنیم که در زمان texture حال بایستی

شدن بهتر بنظر برسد : squash

,D3DDevice.SetTextureStageState 0

D3DTSS_MAGFILTER, D3DTEXF_LINEAR

,D3DDevice.SetTextureStageState 0

D3DTSS_MINFILTER, D3DTEXF_LINEAR

را فعال می کنیم : Z حال فیلتر

D3DDevice.SetRenderState D3DRS_ZENABLE, 1

را تنظیم می کنیم : projection و view ،world سپس ماتریسهای

matWorld D3DXMatrixIdentity

D3DDevice.SetTransform D3DTS_WORLD, matWorld

matView, MakeVector(0, 9, -9), D3DXMatrixLookAtLH

(0 ,MakeVector(0, 0, 0), MakeVector(0, 1

D3DDevice.SetTransform D3DTS_VIEW, matView

matProj, pi / 4, 1, 0.1, 500 D3DXMatrixPerspectiveFovLH

,D3DDevice.SetTransform D3DTS_PROJECTION

matProj

٢۴٨

حال به بخش تنظیم پارامترهای فونت می رسیم . در مورد فونت دو

بعدی عادی :

fnt.Name = "Verdana"x

18 = fnt.Size

fnt.Bold = True

Set MainFontDesc = fnt

D3DX.CreateFont(D3DDevice, = Set MainFont

MainFontDesc.hFont)x

: custom و در مورد فونت

D3DX.CreateTextureFromFileEx(D3DDevice, = Set fntTex

,yourfilename, 256, 128, D3DX_DEFAULT, 0

D3DFMT_UNKNOWN, D3DPOOL_MANAGED,

,D3DX_FILTER_POINT, D3DX_FILTER_POINT

HFF00FF00, ByVal 0, ByVal 0)x&

end function

بصورت زیر خواهد بود : Render روتین

Public Sub Render()x

D3DCLEAR_TARGET Or ,0 D3DDevice.Clear 0, ByVal

D3DCLEAR_ZBUFFER, 0, 1#, 0

D3DDevice.BeginScene

٢۴٩

برای رندر متن با فونت عادی بصورت زیر عمل می کنیم :

TextRect.Top = 440

1 = TextRect.Left

TextRect.bottom = 480

TextRect.Right = 640

HFFCCCCFF, "Current & ,D3DX.DrawText MainFont

FPS_Current, TextRect, DT_TOP Or & " :Frame Rate

DT_CENTER

بصورت زیر عمل می کنیم : custom برای رندر متن با فونت

,"RenderStringFromCustomFont_2D "Hamed Sheidaian

16 ,16 ,1 ,1

D3DDevice.EndScene

ByVal 0 ,D3DDevice.Present ByVal 0, ByVal 0, 0

End Sub

همانطور که مشاهده می کنید از روتینی با نام

استفاده شده است : RenderStringFromCustomFont_2D

RenderStringFromCustomFont_2D(strText Private Sub

Single, Height As As String, startX As Single, StartY As

Integer, Width As Integer)x

Dim I As Integer

٢۵٠

As Integer, CharY As Integer Dim CharX

Dim Char As String

Integer Dim LinearEntry As

If Len(strText) = 0 Then Exit Sub

For I = 1 To Len(strText)x

را انتخاب کنیم . برای اینکار texture 1 - ابتدا بایستی مختصات

جدا کنیم : texture را در entry بایستی هر

Char = Mid$(strText, I, 1)x

Then 90 => (And Asc(Char 65 =< (If Asc(Char

LinearEntry = Asc(Char) - 65

Then 122 => (And Asc(Char 97 =< (Asc(Char ElseIf

LinearEntry = Asc(Char) - 71

Then 57 => (And Asc(Char 48 =< (ElseIf Asc(Char

Asc(Char) + 4 = LinearEntry

ElseIf Char = " " Then

LinearEntry = 63

Then "." = ElseIf Char

LinearEntry = 62

ElseIf Char = ";" Then

LinearEntry = 66

Char = "/" Then ElseIf

LinearEntry = 64

ElseIf Char = "," Then

65 = LinearEntry

End If

٢۵١

کاراکتر را grid بایستی مختصات LinearEntry بعد از مقداردهی

پردازش کنیم :

Then 15 => If LinearEntry

0 = CharY

CharX = LinearEntry

End If

Then 31 => And LinearEntry 16 =< If LinearEntry

CharY = 1

CharX = LinearEntry - 16

End If

Then 47 => And LinearEntry 32 =< LinearEntry If

CharY = 2

LinearEntry - 32 = CharX

End If

Then 63 => And LinearEntry 48 =< If LinearEntry

CharY = 3

CharX = LinearEntry - 48

End If

Then 79 => And LinearEntry 64 =< If LinearEntry

CharY = 4

CharX = LinearEntry - 64

If End

های مورد نیاز برای رسم کاراکتر را تولید کنیم vertex 2 - حال بایستی

:

٢۵٢

I), * vertChar(0) = CreateTLVertex(startX + (Width

HFFFFF& ,StartY, 0, 1

F,0,(1/16)*CharX,(1/8)*CharY)

CreateTLVertex(startX + (Width * I) + = (vertChar(1

HFFFFF& ,Width, StartY, 0, 1

CharX) + (1 / 16), (1 / 8) * CharY * (16 / 1)),0 ,F)

CreateTLVertex(startX + (Width * I), = (vertChar(2

HFFFFF& ,StartY + Height, 0, 1

CharX, ((1 / 8) * CharY) + (1 / 8 * (16 / 1) ,0 ,F))

CreateTLVertex(startX + (Width * I) + = (vertChar(3

* (16 / 1)) ,Width, StartY + Height, 0, 1, HFFFFFF, 0

CharX) + (1 / 16), ((1 / 8) * CharY) + (1 / 8))x

ها : vertex 3 - رندر

fntTex ,D3DDevice.SetTexture 0

D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP,

Len(vertChar(0))x ,(2, vertChar(0

Next I

End Sub

قسمت دهم DirectX-Graphic آموزش

Mesh موضوع : ترسیم اشیا سه بعدی با استفاده از شی

می باشد امکان ترسیم اشیا سه بعدی D3DX که جزو اشیا Mesh شی

٢۵٣

دلخواه را به شما می دهد . در custom پایه و همچنین ترسیم مش های

استفاده می ( sphere ) برای ترسیم یک کره Mesh این درس از شی

را بصورت زیر تعریف کنید : sphere کنیم . ابتدا متغیر

Dim sphere as D3DXMesh

به کره به متغیرهای material همچنین برای نورپردازی و اختصاص

زیر نیاز داریم :

Dim d3dLight As D3DLIGHT8

D3DMATERIAL8 Dim material As

Dim Col As D3DCOLORVALUE

D3DDevice و D3DX و D3D پس از ساخت اشیا Initial در تابع

به ( material ) بایستی پارامترهای رنگ ، نورپردازی و اختصاص ماده

کره را بصورت زیر تنظیم کنید :

Col.a = 1

Col.b = 1

Col.g = 1

1 = Col.r

d3dLight.Type = D3DLIGHT_DIRECTIONAL

Col = d3dLight.diffuse

d3dLight.Direction = vec(-1, -1, -1)x

٢۵۴

1-) است . ,-1,- و بردار جهت ( 1 col نورپردازی از نوع جهت دار با رنگ

نکته :

رنگی است که هنگامیکه جسم در سایه باشد به خود می ambient رنگ

گیرد . بعبارت دیگر این رنگ را جسم وقتی که در معرض یک نور

باشد از خود منعکس می کند . ambient

رنگی است که هنگامیکه جسم در معرض نور مستقیم قرار diffuse رنگ

بگیرد از خود منعکس می کند .

material.Ambient = Col

Col = material.diffuse

d3dDevice.SetMaterial material

d3dLight ,d3dDevice.SetLight 0

d3dDevice.LightEnable 0, 1

را تنظیم کنید : rendering سپس بایستی پارامترهای

1 ,d3dDevice.SetRenderState D3DRS_LIGHTING

d3dDevice.SetRenderState D3DRS_ZENABLE, 1

D3DRS_LIGHTING, 1 d3dDevice.SetRenderState

1 ,d3dDevice.SetRenderState D3DRS_ZENABLE

,d3dDevice.SetRenderState D3DRS_SHADEMODE

D3DSHADE_GOURAUD

H202020& ,d3dDevice.SetRenderState D3DRS_AMBIENT

d3dDevice.SetTextureStageState 0,

D3DTEXF_LINEAR ,D3DTSS_MAGFILTER

٢۵۵

d3dDevice.SetTextureStageState 0,

D3DTEXF_LINEAR ,D3DTSS_MINFILTER

را بسازیم : sphere حال بایستی شی

,20 ,1000 ,Set Sphere = d3dx.CreateSphere(d3dDevice, 2

Nothing)x

هایی است که کره با آن ساخته می slice که 2 شعاع کره و 1000 تعداد

شود .

سپس بردارهای نقطه دید و مکان دوربین و رنگ زمینه را تنظیم کنید (

هستند ) . D3DVECTOR از نوع camerapoint و viewpoint

(ViewPoint = vec(0, 0, 0

(4 ,4 ,CameraPoint = vec(4

H404040& = BackColor

ابتدا ماتریسها و بردارهای صحنه را تنظیم می کنیم Render در روتین

:

matWorld D3DXMatrixIdentity

d3dDevice.SetTransform D3DTS_WORLD, matWorld

matView, Rotation D3DXMatrixRotationY

D3DXMatrixLookAtLH matTemp, CameraPoint,

٢۵۶

(0 ,1 ,ViewPoint, vec(0

D3DXMatrixMultiply matView, matView, matTemp

D3DTS_VIEW, matView d3dDevice.SetTransform

500 ,D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1

d3dDevice.SetTransform D3DTS_PROJECTION, matProj

در پایان نیز شروع به رندر صحنه می کنیم :

d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or

0 ,D3DCLEAR_ZBUFFER, BackColor, 1

d3dDevice.BeginScene

0 Sphere.DrawSubset

d3dDevice.EndScene

0 d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal

مقدمه - Direct3D مباحث پیشرفته

موضوع : مروری بر مباحث قبلی - ساخت یک موتور گرافیکی سه بعدی

با هم مروری بر ، Direct3D قبل از شروع مباحث جدید برنامه نویسی

مباحث قبلی خواهیم داشت . ( مباحث قبلی در آرشیو موجود می باشند )

.

سه بعدی ساخته و Engine در این درس با استفاده از مطالب قبلی یک

از امکانات آن در یک برنامه نمونه استفاده خواهیم کرد .

دارای دو کلاس است : engine این

MainD3D 1 – کلاس

٢۵٧

D3Dobject 2 – کلاس

سه device متغیرها و توابع لازم برای ساخت یک MainD3D در کلاس

بعدی ، تنظیمات ماتریسی ، تابع رندر و غیره موجود می باشد .

متغیرهای عمومی این کلاس عبارتند از :

Public g_DX As New DirectX8

Direct3D8 Public g_D3D As

Public g_D3DX As New D3DX8

Direct3DDevice8 Public g_D3DDevice As

Public NTextures As Long

روتین ها و توابع این کلاس عبارتند از :

را می سازد و D3Ddevice و D3D این روتین ، اشیا : InitD3D - 1

پارامترهای آنها را تنظیم می کند .

View روتین ایجاد ماتریس : ApplyCameraChanges – 2

Projection روتین ایجاد ماتریس : SetupMatrices – 3

در این روتین عملیات لازم برای شروع عمل رندر : StartRender – 4

صورت می گیرد .

این تابع ، یک شی سه بعدی از نوع کلاس : RenderObject – 5

را می گیرد و بردارهای مورد نیاز و نیز بافت شی را تنظیم D3Dobject

می کند و در پایان شی را ترسیم می کند .

در این روتین به عملیات رندر پایان داده می شود : FinishRender – 6

.

Direct3D روتین از بین بردن اشیا :Cleanup – 7

تابع ساخت یک بردار سه بعدی : CreateVector – 8

روتین ساخت یک بافت جدید : CreateTextures – 9

تابع مقداردهی به یک بافت :InitTexture – 10

متغیرها و توابع لازم برای ایجاد یک شی سه D3Dobject در کلاس

بعدی و اختصاص بافت به آن موجود می باشد .

٢۵٨

عمومی تعریف شده است : type در این کلاس دو

NormalVERTEX - 1

TeturedVERTEX - 2

همچنین روتین ها و توابع این کلاس عبارتند از :

ها و بافت شی را vertex تابعی که تنظیمات اولیه : InitObject – 1

انجام می دهد .

های مورد نیاز vertex روتین ایجاد : Vertex – 2

تابعی که مد رندر را مشخص می کند . :GetRenderingMode – 3

دارای بافت و vertex نرمال و ساخت vertex و نیز یکسری تابع ساخت

غیره

این دو کلاس در یک پروژه ویژوال بیسیک قرارداده شده و پروژه با نام

کامپایل شده است . D3Dengine.dll

می خواهیم یک منظره سه بعدی را ایجاد engine حال با استفاده از این

کنیم :

است : دیوار ، آسمان و زمین. object این منظره شامل سه

٢۵٩

تعریف کنیم : MainD3D ابتدا باید یک شی از کلاس

Dim D3D8Main As MainD3D8

را بصورت زیر Wall و Sky ،Floor نیز سه شی Form Load در متد

تعریف می کنیم :

Dim Floor As D3DObject

D3DObject Dim Sky As

Dim Walls As D3Dobject

ایجاد می کنیم : ، D3D8Main سپس این سه شی را به اضافه شی

Set D3D8Main = New D3DEngine.MainD3D8

New D3DEngine.D3DObject = Set Floor

Set Sky = New D3DEngine.D3DObject

D3DEngine.D3Dobject Set Walls = New

می کنیم و سپس بافتهای مورد نیز Initial را MainD3D در ابتدا شی

خود را می سازیم :

Me.hWnd ,D3D8Main.InitD3D True

D3D8Main.CreateTextures 3

"floor.jpg\" + D3D8Main.InitTexture 1, App.Path

"sky.bmp\" + D3D8Main.InitTexture 2, App.Path

"D3D8Main.InitTexture 3, App.Path + "\wall.bmp

floor . می رویم floor های vertex حال به سراغ ایجاد و مقداردهی

مثلثی دارد : face می باشد و بنابراین دو vertex شامل شش

٢۶٠

1 ,Floor.InitObject 6, 2, TriangleList, True

Floor.Vertex 0, -55, -2, -55, vbWhite, 0, 10

vbWhite, 10, 10 ,55- ,Floor.Vertex 1, 55, -2

0 ,Floor.Vertex 2, 55, -2, 55, vbWhite, 10

Floor.Vertex 3, -55, -2, -55, vbWhite, 0, 10

vbWhite, 10, 0 ,Floor.Vertex 4, 55, -2, 55

Floor.Vertex 5, -55, -2, 55, vbWhite, 0, 0

wall . می رویم wall های vertex سپس به سراغ ایجاد و مقداردهی

مثلثی دارد face می باشد و بنابراین هشت vertex شامل بیست و چهار

:

3 ,Walls.InitObject 24, 8, TriangleList, True

HBCE8FC, 0, 1& ,Walls.Vertex 0, -55, -2, -55

HBCE8FC, 5, 1& ,55- ,2- ,Walls.Vertex 1, 55

0 ,HBCE8FC, 5& ,Walls.Vertex 2, 55, 8, -55

HBCE8FC, 0, 1& ,Walls.Vertex 3, -55, -2, -55

HBCE8FC, 5, 0& ,55- ,Walls.Vertex 4, 55, 8

0 ,HBCE8FC, 0& ,Walls.Vertex 5, -55, 8, -55

HBCE8FC, 0, 1& ,Walls.Vertex 6, -55, -2, 55

HBCE8FC, 5, 1& ,55 ,2- ,Walls.Vertex 7, 55

0 ,HBCE8FC, 5& ,Walls.Vertex 8, 55, 8, 55

HBCE8FC, 0, 1& ,Walls.Vertex 9, -55, -2, 55

HBCE8FC, 5, 0& ,55 ,Walls.Vertex 10, 55, 8

٢۶١

0 ,HBCE8FC, 0& ,Walls.Vertex 11, -55, 8, 55

HBCE8FC, 0, 1& ,Walls.Vertex 12, -55, -2, 55

HBCE8FC, 5, 1& ,55- ,2- ,55- ,Walls.Vertex 13

0 ,5 ,HBCE8FC& ,Walls.Vertex 14, -55, 8, -55

HBCE8FC, 0, 1& ,Walls.Vertex 15, -55, -2, 55

HBCE8FC, 5, 0& ,55- ,8 ,55- ,Walls.Vertex 16

0 ,HBCE8FC, 0& ,Walls.Vertex 17, -55, 8, 55

HBCE8FC, 0, 1& ,Walls.Vertex 18, 55, -2, 55

HBCE8FC, 5, 1& ,55- ,2- ,Walls.Vertex 19, 55

0 ,HBCE8FC, 5& ,Walls.Vertex 20, 55, 8, -55

HBCE8FC, 0, 1& ,Walls.Vertex 21, 55, -2, 55

HBCE8FC, 5, 0& ,55- ,Walls.Vertex 22, 55, 8

0 ,HBCE8FC, 0& ,Walls.Vertex 23, 55, 8, 55

شامل sky . می رویم sky های vertex حال به سراغ ایجاد و مقداردهی

مثلثی دارد : face می باشد و بنابراین دو vertex شش

2 ,Sky.InitObject 6, 2, TriangleList, True

HBCE8FC, 0, 1& ,Sky.Vertex 0, -55, 8, -55

HBCE8FC, 0, 1& ,55- ,Sky.Vertex 1, 55, 8

1 ,HBCE8FC, 0& ,Sky.Vertex 2, 55, 8, 55

HBCE8FC, 0, 1& ,Sky.Vertex 3, -55, 8, -55

٢۶٢

HBCE8FC, 0, 1& ,Sky.Vertex 4, 55, 8, 55

HBCE8FC, 0, 1& ,Sky.Vertex 5, -55, 8, 55

در پایان تابع رندر را صدا می کنیم . البته در هر بار عمل رندر کردن ،

دوران می کند تا کل دیوار قابل X-Z دوربین یک درجه در صفحه

مشاهده باشد :

Dim Angle As Double

PI = 3.1415

0 = Angle

Do

DoEvents

D3D8Main.StartRender vbBlack

Sky D3D8Main.RenderObject

D3D8Main.RenderObject Floor

Walls D3D8Main.RenderObject

D3D8Main.FinishRender

0 = If Sqr(Angle ^ 2) = 360 Then Angle

Angle = Angle + 1

(360 / (D3D8Main.CamLookAtX = Sin((Angle * 2 * PI

(360 / (D3D8Main.CamLookAtZ = Cos((Angle * 2 * PI

D3D8Main.ApplyCameraChanges

Loop

و سورس D3DEngine.dll نکته : برای دریافت این برنامه و نیز دریافت

آن ، پیغامی را بهمراه آدرس ایمیل خود در بخش نظرخوا

   + MOHSEN GHASEMI - ٦:٥٠ ‎ب.ظ ; ۱۳۸٩/۳/٢٩