程序代码如下(直接套用函数pnpoly):
int pnpoly(int nvert, float vertx, float verty, float testx, float testy)
{
int i, j, c = 0;
for (i = 0, j = nvert-1; i < nvert; j = i++) {
if ( ((verty[i]>testy) != (verty[j]>testy)) &&
(testx < (vertx[j]-vertx[i]) (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
c = !c;
}
return c;
}
参数说明:
nvert: 多边形的顶点数
vertx, verty: 顶点X坐标和Y坐标分别组成的数组
testx, testy: 需要测试的点的X坐标和Y坐标
扩展资料:
判定一个点是否在多边形内部最简单的方法是使用射线法,因为它能适用于所有类型的多边形,不用考虑特殊的情况而且速度也比较快。
该算法的思想很简单:在多边形外面任意一点画一条虚拟的射线到p(x,y)然后计算该射线与多边形上的边相交的次数。如果该次数是偶数,说明p(x,y)在多边形外,如果是奇数,则在多边形内。
我有一个 API 程序,可以用于“画”image。
输入文件是 ASCII 文件,第一行 是2 个 整数,用空白分隔,第一个是 宽度(像素点点数)w,第二个是 高度(像素点点数)h
第二行起 是 16进制 数,数值 是RGB,每个数2位, 也就是 %2x%2x%2x 格式 到底。共有像素点 wh 个。当然,你愿意每行加个换行符号也可以。
运行时 打入: 程序名 RGB值文件名
程序如下(里面可能含一些无用的码,因为是从别的应用程序简化来的):
/ =======================================================
// cl show_rgbcpp
// for rainbow
// img rgb file:
// line1: img_w img_h
// line2: RRGGBBrrggbbRRGGBB in %2X%2X%2X and no space
L_o_o_n_i_e
========================================================/
#include <Afxwinh>
#include <processh>
#include <mathh>
#include <Winuserh>
#define DEBUG 1
#pragma comment (lib, "User32lib")
HWND hWndMain;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
void OnDisplayMessage(char str);
char one_line[80],pname[80],namein[80],str[120];
int len,NN;
LPTSTR argv;
FILE fin;
RECT RectX;
int RectDy,RectW,RectH;
int x_r=495,x_g=495,x_b=495,x_shift=10,y_shift=20;
long int v_r,v_g,v_b;
COLORREF img;
int img_w,img_h;
unsigned char rr,gg,bb;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
MSG Msg;
int i,j,k;
//get cmd line
argv = GetCommandLine();
len = strlen(argv);
sprintf(one_line,"%s",argv);
i = sscanf(one_line,"%s %s",&pname[0],&namein[0]);
if (i < 2 ) {sprintf(str,"Usage: %s namein\n",pname); OnDisplayMessage(str);exit(0);};
if ( (fin = fopen(namein,"r"))==NULL) {
sprintf(str,"Can not open %s",namein); OnDisplayMessage( str);exit(0);
};
fscanf(fin,"%d %d\n",&img_w,&img_h);
if (DEBUG==1){
sprintf(str,"img_w=%d img_h=%d\n",img_w,img_h);
OnDisplayMessage( str);
}
img = (COLORREF ) malloc (sizeof(COLORREF) img_w img_h);
if (!img){
sprintf(str,"No enough memory foe img"); OnDisplayMessage( str);exit(0);
}
k=0;
for (j=0;j<img_h;j++) for (i=0;i<img_w;i++){
fscanf(fin,"%2x%2x%2x",&rr,&gg,&bb);
img[k]=RGB(rr,gg,bb);k++;
};
fclose(fin);
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return MsgwParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static long nXChar,nYChar,xInc,yInc;
static int xClient, yClient;
static int xClientMax;
static int xChar, yChar;
static int xPos,yPos;
static int xMax,yMax;
SCROLLINFO si;
HDC hdc;
short x;
TEXTMETRIC tm;
PAINTSTRUCT ps;
COLORREF color;
HFONT font;
HPEN hP1; // pen
HBRUSH hBr,hBrR,hBrG,hBrB;
CPoint aP,mousePos;
HWND h_wnd2;
int i,j,k;
switch(message)
{
case WM_CREATE:
hdc=GetDC(hwnd);
GetTextMetrics(hdc,&tm);
nXChar=tmtmAveCharWidth;
nYChar=tmtmHeight;
xInc=1;yInc=1; xChar=nXChar; yChar=nYChar; // for scroll window
ReleaseDC(hwnd,hdc);
xClientMax = 800;
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps); // begin paint
SetGraphicsMode(hdc,GM_ADVANCED);
SetWindowExtEx(hdc,700,400,NULL); // cx=700,cy=400 logical unit
SetViewportExtEx(hdc,600,400,NULL);
SetViewportOrgEx(hdc,x_shift,10,NULL);
SetMapMode(hdc,MM_ANISOTROPIC);
font=CreateFont(
24,10,0,0, FW_NORMAL,0,0,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,NULL,"myfont"
);
SelectObject(hdc,font);
GetTextMetrics(hdc,&tm);
nYChar=tmtmHeight;
hBr = CreateSolidBrush(RGB(255,255,255));
SelectObject(hdc,hBr);
RectXleft= x_shift; RectXright=RectXleft + 400;
RectXbottom = y_shift; RectXtop = RectXbottom + 400;
FillRect(hdc, &RectX, hBr);
k=0;
for (j=0;j<img_h;j++){
for (i=0;i<img_w;i++){
hBr = CreateSolidBrush(img[k]); k++;
SelectObject(hdc,hBr);
RectXleft= x_shift + i; RectXright=RectXleft+ 1;
RectXbottom = y_shift + j; RectXtop = RectXbottom + 1;
FillRect(hdc, &RectX, hBr);
DeleteObject(hBr);
}
}
EndPaint(hwnd,&ps); // end paint
return 0L;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS wndclass;
wndclasscbClsExtra=0;
wndclasscbWndExtra=0;
wndclasshbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclasshCursor=LoadCursor(NULL,IDC_ARROW);
wndclasshIcon=LoadIcon(NULL,"END");
wndclasshInstance=hInstance;
wndclasslpfnWndProc=WndProc;
wndclasslpszClassName="Windows Fill";
wndclasslpszMenuName=NULL;
wndclassstyle=CS_HREDRAW|CS_VREDRAW;
return(RegisterClass(&wndclass));
}
void OnDisplayMessage(char str)
{
HWND hWnd;
MessageBox(NULL,str,"show_rgb_info",MB_OK); // API
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow( "Windows Fill", "Show_color",
WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 100,100,800,400, NULL, NULL, hInstance, NULL );
if(!hWnd) return FALSE;
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
/
有一个类似正弦波的坐标数组。
最简单的可以写成char code data1 a[0][]{-2,0,-1,1,0,0,1,-1,2,0}
画出来就是一个周期的波形。
数组里偶数时X坐标,奇数是Y坐标, 数组是从0开始,,第一个位x,第二个为y吧,这样好理解些,
右移一次后,变成a[1][]={-2,-1,-1,0,0,1,1,0,2,-1}
右移2次后,变成a[2][]{-2,0,-1,-1,0,0,1,1,2,0}
右移3次后,变成a[3][]{-2,1,-1,0,0,-1,1,0,2,1}
接下来再从头来,就变成波浪一直右移了。
然后我要做的就是根据数组的初始坐标数组求出波形一格一格右移后的坐标
有两个参数,一个k,表示取第几个坐标,一个sum,表示数组的长度。
程序是这样的,/
void prg1()
{
k=0;
while(k<sum)
{
x=data1[k];
y=data1[k+1];//?;//现在就是要写这个表达式
k=k+2;
}
}
void prg2()
{
sum=0;
while(sum<10)
{
prg1();
sum=sum+2;
}
}
// 我建议,吧波形定义为一个三维数组,比如:data1[4][2][5];这样4表示波形总共就4个波形,2表示坐标,x用0,y用1,,最后5表示对应的值,使用矩阵表示出来的数据调用和循环起来都很简单x,y就可以使用同一个参数
include "mathh"
class point
{
public:
float x;
float y;
//构造函数
point(float x,float y)
{
this->x=x;
this->y=y;
}
};
class line
{
float a;
float b;
float c;
public:
//构造函数
line(float a,float b,float c)
{
this->a=a;
this->b=b;
this->c=c;
}
float getDistance(point p)
{
float x,y;
x=px;
y=py;
return fabs(ax+by+c)/sqrt(aa+bb);
}
};
void main()
{
float x,y;
cout<<"请输入点的X坐标:";
cin>>x;
cout<<"请输入点的Y坐标:";
cin>>y;
point p(x,y);
float a,b,c;
cout<<"请输入a:";
cin>>a;
cout<<"请输入b:";
cin>>b;
cout<<"请输入c:";
cin>>c;
line l(a,b,c);
cout<<"点到直线的距离为:"<<lgetDistance(p)<<endl;
}
1、进入程序主窗口,点击我画圈的那个图标,新建一个文件。2、将其保存在你要保存的工程目录里,文件名为hello注意后缀一定为c,cpp后缀为c++文件。3、然后再文本框里输入以下内容#include <stdioh>
int main(void)
{
printf("hello world!n");
}
然后按ctrl+s保存文件。4、最后点击上面那个编译图标进行c语言的编译。5、编译完成之后,点击那个调试图标运行我们写的程序,发现已经在cmd控制窗口输出hello world了,表示我们的程序运行成功。
想要获取鼠标坐标并不容易,还是一样需要调用两个API函数GetCursorPos() 获取鼠标指针位置(屏幕坐标)然后采用ScreenToClient() 将鼠标指针位置转换为窗口坐标输出即可。上例子。
// 程序名称:通过 API 获取鼠标状态
//
#include <graphicsh>
#include <stdioh>
void main()
{
initgraph(640, 480); // 初始化绘图窗口
HWND hwnd = GetHWnd(); // 获取绘图窗口句柄
POINT point;
TCHAR s[10];
while(true)
{
GetCursorPos(&point); // 获取鼠标指针位置(屏幕坐标)
ScreenToClient(hwnd, &point); // 将鼠标指针位置转换为窗口坐标
// 获取鼠标按键状态可以用 GetAsyncKeyState 函数,这里不再详述。
// 输出鼠标坐标
sprintf(s, _T("%05d"), pointx);
outtextxy(0, 0, s);
sprintf(s, _T("%05d"), pointy);
outtextxy(0, 20, s);
// 适当延时
Sleep(10);
}
}
同样运行环境需要安装EasyX。
这是tc带的库里面的,vc没有的 要么用tc要么用windows的 api 画(特别麻烦)
所以还是用回tc吧 vc 画图要用gdi 很麻烦的先要建立窗口然后 那些 画图的 函数也用起来很麻烦你如果想学的话可以看看那个windows程序设计 那本书网上很多电子版的里面有一章就是教你怎么画图的
以上就是关于速求 c语言编程 给定n个点的坐标,这n个点依次围成一闭合多边形,再给一点(x,y),判断它是否在多边形中全部的内容,包括:速求 c语言编程 给定n个点的坐标,这n个点依次围成一闭合多边形,再给一点(x,y),判断它是否在多边形中、C++有像素点坐标和RGB值,怎么创建一幅图像、请教一个C语言的程序。关于波形坐标输出的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)