Vector Vector_projection(Vector v, Vector w) { float length = Vector_squareLength(w); if(length > 0) { return Vector_multiply(w, Vector_dotProduct(v, w) / length); } else { return Vector_multiply(w, 0.0); } }
int main(int argc, char ** argv) { Vector * vector_a = Vector_create(1024); for (int i = 0; i < vector_a->length; ++i) { vector_a->data[i][0] = i; vector_a->data[i][1] = i; } Vector * vector_b = Vector_create(1024); Vector * vector_c = Vector_create(1024); for (int i = 0; i < vector_b->length; ++i) { vector_b->data[i][0] = i + 1; } struct timeval stop, start; gettimeofday(&start, NULL); for (int i = 0; i < 100000; ++i) { Vector_multiply_real(vector_c, vector_a, vector_b); } gettimeofday(&stop, NULL); printf("took %lu\n", stop.tv_usec - start.tv_usec); Vector * vector_d = Vector_create(2); Vector * vector_e = Vector_create(2); float d_data[] = {1, 1, 2, 2}; float e_data[] = {3, -1, 1, 1}; for (int i = 0; i < 4; ++i) { vector_d->data[i / 2][i % 2] = d_data[i]; vector_e->data[i / 2][i % 2] = e_data[i]; } Vector_print(vector_d); Vector_print(vector_e); Vector_multiply(vector_d, vector_d, vector_e); Vector_print(vector_d); Vector_destroy(vector_a); Vector_destroy(vector_b); Vector_destroy(vector_c); Vector_destroy(vector_d); Vector_destroy(vector_e); }
void Drawable_setAnchorPoint(Drawable* self, Vector point) { smug_assert(_invariant(self)); if (self->mShape != NULL) { Rectangle rect = Shape_getAsRectangle(self->mShape); smug_printf("Moving shape by vector. Before: (%f, %f, %f, %f)", Rectangle_getX(&rect), Rectangle_getY(&rect), Rectangle_getW(&rect), Rectangle_getH(&rect)); smug_printf("New vector: (%f, %f)", Vector_getX(&point), Vector_getY(&point)); smug_printf("Old vector: (%f, %f)", Vector_getX(&self->mAnchorPoint), Vector_getY(&self->mAnchorPoint)); Vector v = Vector_sub(point, self->mAnchorPoint); smug_printf("Moving by vector: (%f, %f)", Vector_getX(&v), Vector_getY(&v)); v = Vector_multiply(v, -1.0); smug_printf("Moving by negative vector: (%f, %f)", Vector_getX(&v), Vector_getY(&v)); Shape_moveByVector(self->mShape, v); rect = Shape_getAsRectangle(self->mShape); smug_printf("Moved shape by vector. After: (%f, %f, %f, %f)", Rectangle_getX(&rect), Rectangle_getY(&rect), Rectangle_getW(&rect), Rectangle_getH(&rect)); self->mAnchorPoint = point; } }
Vector Vector_projectionPlane(Vector v, Vector n) { return Vector_sub(v, Vector_multiply(n, Vector_dotProduct(v, n))); }