void populateForces(vector<Member*> memberList, vector<Joint*> joints) { Matrix forceMatrix(joints.size() * 2, memberList.size() + 1); //Be sure that the members vector is sorted by id if(joints.size()*2 < memberList.size() + 1) { cout << "Bridge makes no sense, force calculations make no sense." << endl; return; } for (int i=0; i<joints.size(); i++) { Joint* curJoint = joints.at(i); //cout << "Joint " << i << ": (" << curJoint->getX() << "," << curJoint->getY() << ")" << endl; //cout << "Has " << curJoint->numMembers() << " members" << endl; //cout << "Those members are: "; /* for (int a=0; a<curJoint->numMembers(); a++) { //cout << curJoint->members[a]->id() << " "; } //cout << endl; */ for (int j=0; j<curJoint->numMembers(); j++) { Joint* otherJoint = curJoint->members[j]->leftJoint() == curJoint ? curJoint->members[j]->rightJoint() : curJoint->members[j]->leftJoint(); for (int k=0; k<joints.size(); k++) { //if (otherJoint == joints[k]) //cout << "OtherJoint " << k << ": (" << otherJoint->getX() << "," << otherJoint->getY() << ")" << endl; } double angle = atan2(otherJoint->getY() - curJoint->getY(), otherJoint->getX() - curJoint->getX()); //cout << angle << endl; forceMatrix.setElement(2*i, curJoint->members[j]->id(), cos(angle)); forceMatrix.setElement(2*i+1, curJoint->members[j]->id(), sin(angle)); //forceMatrix.print(cout); } forceMatrix.setElement(2*i, memberList.size(), -1 * curJoint->appliedX()); forceMatrix.setElement(2*i+1, memberList.size(), -1 * curJoint->appliedY()); } //forceMatrix.print(cout); forceMatrix = forceMatrix.rref(); //forceMatrix.print(cout); for (int i=0; i<memberList.size(); i++) { memberList.at(i)->force = forceMatrix.getElement(i, memberList.size()); } }