我已经写好了代码用k近临分类法分类音乐 代码如下
#include <vector>
#include <algorithm>
#include<iostream>;
using namespace std;
// 定义音乐样本的结构体
struct MusicSample {
int id;
int slowDuration;
int fastDuration;
std::string genre;
};
// 计算欧式距离
double calculateDistance(int slowDuration, int fastDuration, int xSlowDuration, int xFastDuration) {
int diffSlow = slowDuration - xSlowDuration;
int diffFast = fastDuration - xFastDuration;
return sqrt(diffSlow * diffSlow + diffFast * diffFast);
}
// k近邻分类算法
std::string classifyMusic(std::vector<MusicSample>& musicSamples, int xSlowDuration, int xFastDuration, int k) {
// 计算x与所有样本数据的欧式距离
std::vector<std::pair<int, double>> distances;
for (const auto& sample : musicSamples) {
double distance = calculateDistance(sample.slowDuration, sample.fastDuration, xSlowDuration, xFastDuration);
distances.push_back(std::make_pair(sample.id, distance));
}
// 按照距离递增排序
std::sort(distances.begin(), distances.end(), [](const std::pair<int, double>& a, const std::pair<int, double>& b) {
return a.second < b.second;
});
// 找到k个距离最近的样本
std::vector<std::string> genres;
for (int i = 0; i < k; ++i) {
int sampleId = distances[i].first;
for (const auto& sample : musicSamples) {
if (sample.id == sampleId) {
genres.push_back(sample.genre);
break;
}
}
}
// 统计样本中出现最多的类别
int countRock = 0;
int countFolk = 0;
for (const auto& genre : genres) {
if (genre == "摇滚") {
countRock++;
}
else if (genre == "民谣") {
countFolk++;
}
}
// 判定x的分类
if (countRock > countFolk) {
return "摇滚";
}
else if (countRock < countFolk) {
return "民谣";
}
else {
return "未知";
}
}
int main() {
// 初始化音乐样本数据集
std::vector<MusicSample> musicSamples = {
{1, 100, 80, "民谣"},
{2, 140, 40, "民谣"},
{3, 20, 160, "摇滚"},
{4, 110, 70, "民谣"},
{5, 30, 150, "摇滚"}
};
// 输入未知分类的mp3信息
int xSlowDuration ;
int xFastDuration ;
cout << "xSlowDuration=";
cin >> xSlowDuration;
cout<< "xFastDuration=";
cin >> xFastDuration;
int k ;
cout << "k=";
cin >> k;
// 进行分类
std::string classification = classifyMusic(musicSamples, xSlowDuration, xFastDuration, k);
// 输出分类结果
std::cout << "根据k近邻分类算法,判定x的分类为:" << classification << std::endl;
return 0;
}
然后我设计的MFC版面
相关的代码放到相对应控件
在使用鼠标拉取的矩形中选取点位置并用画线函数连接点实现。三角形包括3个顶点。拉取矩形的起点坐标为(pStart.x,pStart.y),终点坐标为(pEnd.x,pEnd.y)。根据两种三角形在矩形中绘制时的对应比例,等腰三角形3个顶点坐标分别为:
P1 (pStart.x+pEnd.x)/2,pStart.y);
P2 (pStart.x,pEnd.y);
P3 (pEnd.x,pEnd.y);
直角三角形的三个顶点坐标为:
P1 (pStart.x,pStart.y);
P2 (pEnd.x,pEnd.y);
P3 (pStart.x,pEnd.y);
要将已编写的音乐分类代码与MFC界面进行整合,可以按照以下步骤进行操作:
将音乐分类代码封装为一个函数或类:首先,将已编写的音乐分类代码封装为一个函数或类。如果是一个函数,可以将代码封装在一个新的.cpp文件中,并在该文件中声明和定义该函数。如果是一个类,则可以创建一个新的.h和.cpp文件,将代码封装在类中。
在MFC界面的.cpp文件中引入音乐分类代码的头文件:在MFC界面的.cpp文件中,使用#include指令引入音乐分类代码的头文件。例如,如果音乐分类代码封装在一个.h文件中,可以在MFC界面的.cpp文件的顶部添加#include "music_classification.h"。
在MFC界面的.cpp文件中调用音乐分类代码的函数或类:在MFC界面的.cpp文件中,可以调用封装的音乐分类函数或类。根据音乐分类代码的具体实现方式,可能需要创建一个对象,然后调用相应的函数,或者直接调用函数。
处理音乐分类结果:根据音乐分类代码的返回类型和需求,可以在MFC界面中处理音乐分类的结果。例如,可以在界面上显示分类结果,或者根据分类结果执行相应的操作。
以下是一个示例代码,演示如何将音乐分类代码与MFC界面进行整合:
// music_classification.h
#pragma once
// 假设音乐分类的函数名为classifyMusic
int classifyMusic(const std::string& musicFile);
// MFC界面的.cpp文件
#include "music_classification.h"
// 假设MFC界面的按钮点击事件函数为OnButtonClicked
void CMyMFCDialog::OnButtonClicked()
{
// 获取用户选择的音乐文件路径,假设存储在musicFilePath中
// 调用音乐分类函数进行分类
int result = classifyMusic(musicFilePath);
// 处理分类结果,例如在界面上显示结果
CString info;
info.Format(_T("音乐分类结果:%d"), result);
GetDlgItem(IDC_RESULT_LABEL)->SetWindowText(info);
}
请注意,上述代码是一个简化示例,具体实现可能需要根据具体情况进行调整和修改。另外,在实际过程中还可能需要处理异常情况、优化代码等。以上是一种常见的将已编写的音乐分类代码与MFC界面进行整合的方法,希望能对你有所帮助。如果你有任何进一步的问题,请随时追问。