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

📄 cppolyshape.c

📁 Compressed file has password
💻 C
字号:
/* Copyright (c) 2007 Scott Lembcke *  * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include <stdlib.h>#include <stdio.h>#include <math.h>#include "chipmunk.h"cpPolyShape *cpPolyShapeAlloc(void){	return (cpPolyShape *)calloc(1, sizeof(cpPolyShape));}static voidcpPolyShapeTransformVerts(cpPolyShape *poly, cpVect p, cpVect rot){	cpVect *src = poly->verts;	cpVect *dst = poly->tVerts;		for(int i=0; i<poly->numVerts; i++)		dst[i] = cpvadd(p, cpvrotate(src[i], rot));}static voidcpPolyShapeTransformAxes(cpPolyShape *poly, cpVect p, cpVect rot){	cpPolyShapeAxis *src = poly->axes;	cpPolyShapeAxis *dst = poly->tAxes;		for(int i=0; i<poly->numVerts; i++){		cpVect n = cpvrotate(src[i].n, rot);		dst[i].n = n;		dst[i].d = cpvdot(p, n) + src[i].d;	}}static cpBBcpPolyShapeCacheData(cpShape *shape, cpVect p, cpVect rot){	cpPolyShape *poly = (cpPolyShape *)shape;		cpFloat l, b, r, t;		cpPolyShapeTransformAxes(poly, p, rot);	cpPolyShapeTransformVerts(poly, p, rot);		cpVect *verts = poly->tVerts;	l = r = verts[0].x;	b = t = verts[0].y;		// TODO do as part of cpPolyShapeTransformVerts?	for(int i=1; i<poly->numVerts; i++){		cpVect v = verts[i];				l = cpfmin(l, v.x);		r = cpfmax(r, v.x);				b = cpfmin(b, v.y);		t = cpfmax(t, v.y);	}		return cpBBNew(l, b, r, t);}static voidcpPolyShapeDestroy(cpShape *shape){	cpPolyShape *poly = (cpPolyShape *)shape;		free(poly->verts);	free(poly->tVerts);		free(poly->axes);	free(poly->tAxes);}static intcpPolyShapePointQuery(cpShape *shape, cpVect p){	// TODO Check against BB first?	return cpPolyShapeContainsVert((cpPolyShape *)shape, p);}static const cpShapeClass polyClass = {	CP_POLY_SHAPE,	cpPolyShapeCacheData,	cpPolyShapeDestroy,	cpPolyShapePointQuery,};cpPolyShape *cpPolyShapeInit(cpPolyShape *poly, cpBody *body, int numVerts, cpVect *verts, cpVect offset){		poly->numVerts = numVerts;	poly->verts = (cpVect *)calloc(numVerts, sizeof(cpVect));	poly->tVerts = (cpVect *)calloc(numVerts, sizeof(cpVect));	poly->axes = (cpPolyShapeAxis *)calloc(numVerts, sizeof(cpPolyShapeAxis));	poly->tAxes = (cpPolyShapeAxis *)calloc(numVerts, sizeof(cpPolyShapeAxis));		for(int i=0; i<numVerts; i++){		cpVect a = cpvadd(offset, verts[i]);		cpVect b = cpvadd(offset, verts[(i+1)%numVerts]);		cpVect n = cpvnormalize(cpvperp(cpvsub(b, a)));		poly->verts[i] = a;		poly->axes[i].n = n;		poly->axes[i].d = cpvdot(n, a);	}		cpShapeInit((cpShape *)poly, &polyClass, body);	return poly;}cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset){	return (cpShape *)cpPolyShapeInit(cpPolyShapeAlloc(), body, numVerts, verts, offset);}

⌨️ 快捷键说明

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